From ff271a13d54f0985164c32f5c47be8de37a5728d Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 17:42:30 -0300 Subject: [PATCH 01/31] feat(google-ads): initialize Google Ads MCP with core files - Added .gitignore to exclude node_modules, dist, and environment files. - Created app.json for Google Ads MCP configuration. - Initialized package.json with dependencies and scripts for development and build. - Added README.md with features, authentication details, and usage examples. - Set up TypeScript configuration in tsconfig.json. - Implemented server structure with constants, main entry, and environment handling. - Developed tools for account, campaign, ad group, ad, and keyword management. - Included reporting tools for performance metrics. - Defined types for Google Ads API interactions. --- google-ads/.gitignore | 5 + google-ads/README.md | 253 +++++ google-ads/app.json | 13 + google-ads/package.json | 28 + google-ads/server/constants.ts | 402 ++++++++ google-ads/server/lib/env.ts | 17 + google-ads/server/lib/google-ads-client.ts | 1015 ++++++++++++++++++++ google-ads/server/lib/types.ts | 906 +++++++++++++++++ google-ads/server/main.ts | 125 +++ google-ads/server/tools/accounts.ts | 121 +++ google-ads/server/tools/ad-groups.ts | 366 +++++++ google-ads/server/tools/ads.ts | 309 ++++++ google-ads/server/tools/campaigns.ts | 456 +++++++++ google-ads/server/tools/index.ts | 37 + google-ads/server/tools/keywords.ts | 466 +++++++++ google-ads/server/tools/reports.ts | 378 ++++++++ google-ads/shared/deco.gen.ts | 68 ++ google-ads/tsconfig.json | 31 + 18 files changed, 4996 insertions(+) create mode 100644 google-ads/.gitignore create mode 100644 google-ads/README.md create mode 100644 google-ads/app.json create mode 100644 google-ads/package.json create mode 100644 google-ads/server/constants.ts create mode 100644 google-ads/server/lib/env.ts create mode 100644 google-ads/server/lib/google-ads-client.ts create mode 100644 google-ads/server/lib/types.ts create mode 100644 google-ads/server/main.ts create mode 100644 google-ads/server/tools/accounts.ts create mode 100644 google-ads/server/tools/ad-groups.ts create mode 100644 google-ads/server/tools/ads.ts create mode 100644 google-ads/server/tools/campaigns.ts create mode 100644 google-ads/server/tools/index.ts create mode 100644 google-ads/server/tools/keywords.ts create mode 100644 google-ads/server/tools/reports.ts create mode 100644 google-ads/shared/deco.gen.ts create mode 100644 google-ads/tsconfig.json diff --git a/google-ads/.gitignore b/google-ads/.gitignore new file mode 100644 index 00000000..9cd80b03 --- /dev/null +++ b/google-ads/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +.env +.dev.vars + diff --git a/google-ads/README.md b/google-ads/README.md new file mode 100644 index 00000000..45716f53 --- /dev/null +++ b/google-ads/README.md @@ -0,0 +1,253 @@ +# Google Ads MCP + +MCP (Model Context Protocol) server for Google Ads API v18. Manage campaigns, ad groups, ads, keywords, and get performance reports. + +## Features + +- **Account Management**: List accessible customers, get customer details +- **Campaign Management**: List, create, update, pause, and enable campaigns +- **Ad Group Management**: List, create, update, pause, and enable ad groups +- **Ad Management**: List, create responsive search ads, pause, and enable ads +- **Keyword Management**: List, create, update, pause, enable, and remove keywords (including negative keywords) +- **Performance Reports**: Account, campaign, ad group, and keyword performance metrics + +## Authentication + +This MCP uses OAuth 2.0 with PKCE for authentication. Users will be redirected to Google to authorize access to their Google Ads accounts. + +### Required OAuth Scope + +``` +https://www.googleapis.com/auth/adwords +``` + +### Environment Variables + +```bash +GOOGLE_CLIENT_ID=your_google_client_id +GOOGLE_CLIENT_SECRET=your_google_client_secret +``` + +## Tools + +### Account Tools + +| Tool | Description | +|------|-------------| +| `list_accessible_customers` | List all Google Ads customer accounts accessible by the authenticated user | +| `get_customer` | Get detailed information about a specific customer account | + +### Campaign Tools + +| Tool | Description | +|------|-------------| +| `list_campaigns` | List all campaigns for a customer account (optionally filter by status) | +| `get_campaign` | Get detailed information about a specific campaign | +| `create_campaign` | Create a new campaign with budget | +| `update_campaign` | Update campaign settings (name, dates, network settings) | +| `pause_campaign` | Pause a campaign | +| `enable_campaign` | Enable a campaign | + +### Ad Group Tools + +| Tool | Description | +|------|-------------| +| `list_ad_groups` | List ad groups (optionally filter by campaign) | +| `get_ad_group` | Get detailed information about a specific ad group | +| `create_ad_group` | Create a new ad group in a campaign | +| `update_ad_group` | Update ad group settings (name, bids) | +| `pause_ad_group` | Pause an ad group | +| `enable_ad_group` | Enable an ad group | + +### Ad Tools + +| Tool | Description | +|------|-------------| +| `list_ads` | List ads (optionally filter by ad group) | +| `get_ad` | Get detailed information about a specific ad | +| `create_responsive_search_ad` | Create a new Responsive Search Ad (RSA) | +| `pause_ad` | Pause an ad | +| `enable_ad` | Enable an ad | + +### Keyword Tools + +| Tool | Description | +|------|-------------| +| `list_keywords` | List keywords (optionally filter by ad group) | +| `get_keyword` | Get detailed information about a specific keyword | +| `create_keyword` | Add a new keyword to an ad group | +| `create_negative_keyword` | Add a negative keyword to block certain searches | +| `update_keyword` | Update keyword settings (status, bid, URLs) | +| `pause_keyword` | Pause a keyword | +| `enable_keyword` | Enable a keyword | +| `remove_keyword` | Permanently remove a keyword | + +### Report Tools + +| Tool | Description | +|------|-------------| +| `get_account_performance` | Get overall account performance metrics | +| `get_campaign_performance` | Get campaign performance with daily breakdown | +| `get_ad_group_performance` | Get ad group performance metrics | +| `get_keyword_performance` | Get keyword performance metrics | + +## Usage Examples + +### List accessible customers + +```json +{ + "tool": "list_accessible_customers", + "input": {} +} +``` + +### Create a Search campaign + +```json +{ + "tool": "create_campaign", + "input": { + "customerId": "1234567890", + "name": "My Search Campaign", + "advertisingChannelType": "SEARCH", + "budgetAmountMicros": "10000000", + "status": "PAUSED", + "targetGoogleSearch": true, + "targetSearchNetwork": true + } +} +``` + +### Create an ad group + +```json +{ + "tool": "create_ad_group", + "input": { + "customerId": "1234567890", + "campaignResourceName": "customers/1234567890/campaigns/9876543210", + "name": "Brand Keywords", + "cpcBidMicros": "1000000" + } +} +``` + +### Create a Responsive Search Ad + +```json +{ + "tool": "create_responsive_search_ad", + "input": { + "customerId": "1234567890", + "adGroupResourceName": "customers/1234567890/adGroups/1111111111", + "finalUrls": ["https://example.com/landing-page"], + "headlines": [ + "Buy Running Shoes", + "Free Shipping Available", + "Top Brands on Sale" + ], + "descriptions": [ + "Shop our wide selection of running shoes. Free returns.", + "Get the best deals on athletic footwear. Order now!" + ], + "path1": "shoes", + "path2": "running" + } +} +``` + +### Add a keyword + +```json +{ + "tool": "create_keyword", + "input": { + "customerId": "1234567890", + "adGroupResourceName": "customers/1234567890/adGroups/1111111111", + "text": "running shoes", + "matchType": "PHRASE", + "cpcBidMicros": "500000" + } +} +``` + +### Get campaign performance + +```json +{ + "tool": "get_campaign_performance", + "input": { + "customerId": "1234567890", + "dateRange": "LAST_30_DAYS" + } +} +``` + +## Date Range Presets + +For reports, you can use the following date range presets: + +- `TODAY` +- `YESTERDAY` +- `LAST_7_DAYS` +- `LAST_14_DAYS` +- `LAST_30_DAYS` +- `LAST_90_DAYS` +- `THIS_WEEK_SUN_TODAY` +- `THIS_WEEK_MON_TODAY` +- `LAST_WEEK_SUN_SAT` +- `LAST_WEEK_MON_SUN` +- `THIS_MONTH` +- `LAST_MONTH` +- `ALL_TIME` + +## Money Values + +All monetary values in Google Ads API are in **micros** (1/1,000,000 of the currency unit): + +- $1.00 = 1,000,000 micros +- $0.50 = 500,000 micros +- $10.00 = 10,000,000 micros + +## Resource Names + +Google Ads uses resource names to identify entities: + +- Customer: `customers/1234567890` +- Campaign: `customers/1234567890/campaigns/9876543210` +- Campaign Budget: `customers/1234567890/campaignBudgets/1111111111` +- Ad Group: `customers/1234567890/adGroups/2222222222` +- Ad Group Ad: `customers/1234567890/adGroupAds/2222222222~3333333333` +- Ad Group Criterion (Keyword): `customers/1234567890/adGroupCriteria/2222222222~4444444444` + +## Development + +### Install dependencies + +```bash +bun install +``` + +### Run locally + +```bash +bun run dev +``` + +### Build + +```bash +bun run build +``` + +### Type check + +```bash +bun run check +``` + +## License + +MIT + diff --git a/google-ads/app.json b/google-ads/app.json new file mode 100644 index 00000000..d69c60a4 --- /dev/null +++ b/google-ads/app.json @@ -0,0 +1,13 @@ +{ + "scopeName": "deco", + "name": "google-ads", + "friendlyName": "Google Ads", + "connection": { + "type": "HTTP", + "url": "https://sites-google-ads.decocache.com/mcp" + }, + "description": "Manage Google Ads campaigns, ad groups, ads, keywords, and get performance reports via API.", + "icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Google_Ads_logo.svg/1200px-Google_Ads_logo.svg.png", + "unlisted": false +} + diff --git a/google-ads/package.json b/google-ads/package.json new file mode 100644 index 00000000..35343088 --- /dev/null +++ b/google-ads/package.json @@ -0,0 +1,28 @@ +{ + "name": "google-ads", + "version": "1.0.0", + "description": "Google Ads MCP Server - Manage campaigns, ad groups, ads, keywords, and get performance reports", + "private": true, + "type": "module", + "scripts": { + "dev": "bun run --hot server/main.ts", + "build:server": "NODE_ENV=production bun build server/main.ts --target=bun --outfile=dist/server/main.js", + "build": "bun run build:server", + "publish": "cat app.json | deco registry publish -w /shared/deco -y", + "check": "tsc --noEmit" + }, + "dependencies": { + "@decocms/runtime": "^1.1.0", + "zod": "^4.0.0" + }, + "devDependencies": { + "@decocms/mcps-shared": "workspace:*", + "@modelcontextprotocol/sdk": "1.25.1", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2" + }, + "engines": { + "node": ">=22.0.0" + } +} + diff --git a/google-ads/server/constants.ts b/google-ads/server/constants.ts new file mode 100644 index 00000000..9fd70ef0 --- /dev/null +++ b/google-ads/server/constants.ts @@ -0,0 +1,402 @@ +/** + * Google Ads API constants and configuration + */ + +/** + * Google Ads API version + */ +export const GOOGLE_ADS_API_VERSION = "v18"; + +/** + * Google Ads API base URL + */ +export const GOOGLE_ADS_API_BASE = `https://googleads.googleapis.com/${GOOGLE_ADS_API_VERSION}`; + +/** + * API Endpoints for Google Ads + */ +export const ENDPOINTS = { + /** + * List accessible customers for the authenticated user + * GET https://googleads.googleapis.com/v18/customers:listAccessibleCustomers + */ + LIST_ACCESSIBLE_CUSTOMERS: `${GOOGLE_ADS_API_BASE}/customers:listAccessibleCustomers`, + + /** + * Get customer details + * @param customerId - The customer ID (e.g., "1234567890") + */ + CUSTOMER: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}`, + + /** + * Search with GAQL query + * POST https://googleads.googleapis.com/v18/customers/{customerId}/googleAds:search + * @param customerId - The customer ID + */ + SEARCH: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/googleAds:search`, + + /** + * Search stream with GAQL query (for large result sets) + * POST https://googleads.googleapis.com/v18/customers/{customerId}/googleAds:searchStream + * @param customerId - The customer ID + */ + SEARCH_STREAM: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/googleAds:searchStream`, + + /** + * Mutate campaigns + * POST https://googleads.googleapis.com/v18/customers/{customerId}/campaigns:mutate + * @param customerId - The customer ID + */ + CAMPAIGNS_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/campaigns:mutate`, + + /** + * Mutate campaign budgets + * POST https://googleads.googleapis.com/v18/customers/{customerId}/campaignBudgets:mutate + * @param customerId - The customer ID + */ + CAMPAIGN_BUDGETS_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/campaignBudgets:mutate`, + + /** + * Mutate ad groups + * POST https://googleads.googleapis.com/v18/customers/{customerId}/adGroups:mutate + * @param customerId - The customer ID + */ + AD_GROUPS_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/adGroups:mutate`, + + /** + * Mutate ad group ads + * POST https://googleads.googleapis.com/v18/customers/{customerId}/adGroupAds:mutate + * @param customerId - The customer ID + */ + AD_GROUP_ADS_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/adGroupAds:mutate`, + + /** + * Mutate ad group criteria (keywords, etc.) + * POST https://googleads.googleapis.com/v18/customers/{customerId}/adGroupCriteria:mutate + * @param customerId - The customer ID + */ + AD_GROUP_CRITERIA_MUTATE: (customerId: string) => + `${GOOGLE_ADS_API_BASE}/customers/${customerId}/adGroupCriteria:mutate`, +}; + +/** + * Default page size for queries + */ +export const DEFAULT_PAGE_SIZE = 1000; + +/** + * Campaign status values + */ +export const CAMPAIGN_STATUS = { + ENABLED: "ENABLED", + PAUSED: "PAUSED", + REMOVED: "REMOVED", +} as const; + +/** + * Ad group status values + */ +export const AD_GROUP_STATUS = { + ENABLED: "ENABLED", + PAUSED: "PAUSED", + REMOVED: "REMOVED", +} as const; + +/** + * Ad status values + */ +export const AD_STATUS = { + ENABLED: "ENABLED", + PAUSED: "PAUSED", + REMOVED: "REMOVED", +} as const; + +/** + * Keyword match types + */ +export const KEYWORD_MATCH_TYPE = { + EXACT: "EXACT", + PHRASE: "PHRASE", + BROAD: "BROAD", +} as const; + +/** + * Advertising channel types + */ +export const ADVERTISING_CHANNEL_TYPE = { + SEARCH: "SEARCH", + DISPLAY: "DISPLAY", + SHOPPING: "SHOPPING", + VIDEO: "VIDEO", + PERFORMANCE_MAX: "PERFORMANCE_MAX", + DEMAND_GEN: "DEMAND_GEN", + LOCAL: "LOCAL", + SMART: "SMART", + HOTEL: "HOTEL", + LOCAL_SERVICES: "LOCAL_SERVICES", + TRAVEL: "TRAVEL", + DISCOVERY: "DISCOVERY", +} as const; + +/** + * Bidding strategy types + */ +export const BIDDING_STRATEGY_TYPE = { + MANUAL_CPC: "MANUAL_CPC", + MANUAL_CPM: "MANUAL_CPM", + MANUAL_CPV: "MANUAL_CPV", + MAXIMIZE_CONVERSIONS: "MAXIMIZE_CONVERSIONS", + MAXIMIZE_CONVERSION_VALUE: "MAXIMIZE_CONVERSION_VALUE", + TARGET_CPA: "TARGET_CPA", + TARGET_ROAS: "TARGET_ROAS", + TARGET_SPEND: "TARGET_SPEND", + TARGET_IMPRESSION_SHARE: "TARGET_IMPRESSION_SHARE", + ENHANCED_CPC: "ENHANCED_CPC", +} as const; + +/** + * Budget delivery methods + */ +export const BUDGET_DELIVERY_METHOD = { + STANDARD: "STANDARD", + ACCELERATED: "ACCELERATED", +} as const; + +/** + * Ad group types + */ +export const AD_GROUP_TYPE = { + SEARCH_STANDARD: "SEARCH_STANDARD", + DISPLAY_STANDARD: "DISPLAY_STANDARD", + SHOPPING_PRODUCT_ADS: "SHOPPING_PRODUCT_ADS", + VIDEO_TRUE_VIEW_IN_STREAM: "VIDEO_TRUE_VIEW_IN_STREAM", + VIDEO_BUMPER: "VIDEO_BUMPER", + VIDEO_RESPONSIVE: "VIDEO_RESPONSIVE", +} as const; + +/** + * Common GAQL queries + */ +export const GAQL_QUERIES = { + /** + * List all campaigns with basic info + */ + LIST_CAMPAIGNS: ` + SELECT + campaign.id, + campaign.name, + campaign.status, + campaign.advertising_channel_type, + campaign.advertising_channel_sub_type, + campaign.bidding_strategy_type, + campaign.start_date, + campaign.end_date, + campaign.campaign_budget, + campaign.serving_status + FROM campaign + ORDER BY campaign.name + `, + + /** + * List campaigns with performance metrics + */ + LIST_CAMPAIGNS_WITH_METRICS: ` + SELECT + campaign.id, + campaign.name, + campaign.status, + campaign.advertising_channel_type, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.ctr, + metrics.average_cpc + FROM campaign + WHERE segments.date DURING LAST_30_DAYS + ORDER BY campaign.name + `, + + /** + * List all ad groups with basic info + */ + LIST_AD_GROUPS: ` + SELECT + ad_group.id, + ad_group.name, + ad_group.campaign, + ad_group.status, + ad_group.type, + ad_group.cpc_bid_micros + FROM ad_group + ORDER BY ad_group.name + `, + + /** + * List ad groups for a specific campaign + */ + LIST_AD_GROUPS_BY_CAMPAIGN: (campaignId: string) => ` + SELECT + ad_group.id, + ad_group.name, + ad_group.campaign, + ad_group.status, + ad_group.type, + ad_group.cpc_bid_micros + FROM ad_group + WHERE campaign.id = ${campaignId} + ORDER BY ad_group.name + `, + + /** + * List all ads with basic info + */ + LIST_ADS: ` + SELECT + ad_group_ad.ad.id, + ad_group_ad.ad.name, + ad_group_ad.ad.type, + ad_group_ad.ad.final_urls, + ad_group_ad.ad_group, + ad_group_ad.status, + ad_group_ad.policy_summary.approval_status + FROM ad_group_ad + ORDER BY ad_group_ad.ad.id + `, + + /** + * List ads for a specific ad group + */ + LIST_ADS_BY_AD_GROUP: (adGroupId: string) => ` + SELECT + ad_group_ad.ad.id, + ad_group_ad.ad.name, + ad_group_ad.ad.type, + ad_group_ad.ad.final_urls, + ad_group_ad.ad_group, + ad_group_ad.status, + ad_group_ad.policy_summary.approval_status + FROM ad_group_ad + WHERE ad_group.id = ${adGroupId} + ORDER BY ad_group_ad.ad.id + `, + + /** + * List keywords for an ad group + */ + LIST_KEYWORDS: ` + SELECT + ad_group_criterion.criterion_id, + ad_group_criterion.ad_group, + ad_group_criterion.keyword.text, + ad_group_criterion.keyword.match_type, + ad_group_criterion.status, + ad_group_criterion.cpc_bid_micros, + ad_group_criterion.negative + FROM ad_group_criterion + WHERE ad_group_criterion.type = 'KEYWORD' + ORDER BY ad_group_criterion.keyword.text + `, + + /** + * List keywords for a specific ad group + */ + LIST_KEYWORDS_BY_AD_GROUP: (adGroupId: string) => ` + SELECT + ad_group_criterion.criterion_id, + ad_group_criterion.ad_group, + ad_group_criterion.keyword.text, + ad_group_criterion.keyword.match_type, + ad_group_criterion.status, + ad_group_criterion.cpc_bid_micros, + ad_group_criterion.negative, + ad_group_criterion.quality_info.quality_score + FROM ad_group_criterion + WHERE ad_group.id = ${adGroupId} + AND ad_group_criterion.type = 'KEYWORD' + ORDER BY ad_group_criterion.keyword.text + `, + + /** + * Get account performance report + */ + ACCOUNT_PERFORMANCE_REPORT: (dateRange: string) => ` + SELECT + customer.id, + customer.descriptive_name, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.conversions_value, + metrics.ctr, + metrics.average_cpc, + metrics.average_cpm + FROM customer + WHERE segments.date DURING ${dateRange} + `, + + /** + * Get campaign performance report + */ + CAMPAIGN_PERFORMANCE_REPORT: (dateRange: string) => ` + SELECT + campaign.id, + campaign.name, + campaign.status, + segments.date, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.conversions_value, + metrics.ctr, + metrics.average_cpc + FROM campaign + WHERE segments.date DURING ${dateRange} + ORDER BY segments.date DESC + `, + + /** + * Get customer (account) details + */ + GET_CUSTOMER: ` + SELECT + customer.id, + customer.descriptive_name, + customer.currency_code, + customer.time_zone, + customer.tracking_url_template, + customer.auto_tagging_enabled, + customer.manager, + customer.test_account + FROM customer + LIMIT 1 + `, +} as const; + +/** + * Date range presets for reports + */ +export const DATE_RANGE_PRESETS = { + TODAY: "TODAY", + YESTERDAY: "YESTERDAY", + LAST_7_DAYS: "LAST_7_DAYS", + LAST_14_DAYS: "LAST_14_DAYS", + LAST_30_DAYS: "LAST_30_DAYS", + LAST_90_DAYS: "LAST_90_DAYS", + THIS_WEEK_SUN_TODAY: "THIS_WEEK_SUN_TODAY", + THIS_WEEK_MON_TODAY: "THIS_WEEK_MON_TODAY", + LAST_WEEK_SUN_SAT: "LAST_WEEK_SUN_SAT", + LAST_WEEK_MON_SUN: "LAST_WEEK_MON_SUN", + THIS_MONTH: "THIS_MONTH", + LAST_MONTH: "LAST_MONTH", + ALL_TIME: "ALL_TIME", +} as const; diff --git a/google-ads/server/lib/env.ts b/google-ads/server/lib/env.ts new file mode 100644 index 00000000..ae143ab9 --- /dev/null +++ b/google-ads/server/lib/env.ts @@ -0,0 +1,17 @@ +import type { Env } from "../../shared/deco.gen.ts"; + +/** + * Get Google OAuth access token from environment context + * @param env - The environment containing the mesh request context + * @returns The OAuth access token + * @throws Error if not authenticated + */ +export const getGoogleAccessToken = (env: Env): string => { + const authorization = env.MESH_REQUEST_CONTEXT?.authorization; + if (!authorization) { + throw new Error( + "Not authenticated. Please authorize with Google Ads first.", + ); + } + return authorization; +}; diff --git a/google-ads/server/lib/google-ads-client.ts b/google-ads/server/lib/google-ads-client.ts new file mode 100644 index 00000000..04aac9f3 --- /dev/null +++ b/google-ads/server/lib/google-ads-client.ts @@ -0,0 +1,1015 @@ +/** + * Google Ads API client + * Handles all communication with the Google Ads API v18 + */ + +import { ENDPOINTS, DEFAULT_PAGE_SIZE, GAQL_QUERIES } from "../constants.ts"; +import type { + Customer, + Campaign, + CampaignBudget, + AdGroup, + AdGroupAd, + AdGroupCriterion, + ListAccessibleCustomersResponse, + SearchGoogleAdsResponse, + SearchGoogleAdsStreamResponse, + GoogleAdsRow, + MutateCampaignsResponse, + MutateCampaignBudgetsResponse, + MutateAdGroupsResponse, + MutateAdGroupAdsResponse, + MutateAdGroupCriteriaResponse, + CreateCampaignInput, + UpdateCampaignInput, + CreateCampaignBudgetInput, + CreateAdGroupInput, + UpdateAdGroupInput, + CreateResponsiveSearchAdInput, + UpdateAdGroupAdInput, + CreateKeywordInput, + UpdateKeywordInput, + ApiErrorResponse, + CampaignStatus, + AdGroupStatus, + AdGroupAdStatus, + AdGroupCriterionStatus, +} from "./types.ts"; + +export interface GoogleAdsClientConfig { + accessToken: string; +} + +/** + * Google Ads API Client + * Provides typed methods for interacting with Google Ads resources + */ +export class GoogleAdsClient { + private accessToken: string; + + constructor(config: GoogleAdsClientConfig) { + this.accessToken = config.accessToken; + } + + /** + * Make a request to the Google Ads API + */ + private async request(url: string, options: RequestInit = {}): Promise { + const response = await fetch(url, { + ...options, + headers: { + Authorization: `Bearer ${this.accessToken}`, + "Content-Type": "application/json", + ...options.headers, + }, + }); + + if (!response.ok) { + const errorText = await response.text(); + let errorMessage = `Google Ads API error: ${response.status}`; + + try { + const errorData = JSON.parse(errorText) as ApiErrorResponse; + errorMessage = errorData.error?.message || errorMessage; + } catch { + errorMessage = `${errorMessage} - ${errorText}`; + } + + throw new Error(errorMessage); + } + + // Handle 204 No Content + if (response.status === 204) { + return {} as T; + } + + return (await response.json()) as T; + } + + /** + * Execute a GAQL query using the search endpoint + * @param customerId - Customer ID (without hyphens) + * @param query - GAQL query string + * @param pageToken - Optional page token for pagination + * @param pageSize - Optional page size (default: 1000) + */ + async search( + customerId: string, + query: string, + pageToken?: string, + pageSize: number = DEFAULT_PAGE_SIZE, + ): Promise { + const body: Record = { + query: query.trim(), + pageSize, + }; + + if (pageToken) { + body.pageToken = pageToken; + } + + return this.request(ENDPOINTS.SEARCH(customerId), { + method: "POST", + body: JSON.stringify(body), + }); + } + + /** + * Execute a GAQL query using the search stream endpoint + * Returns all results without pagination + * @param customerId - Customer ID (without hyphens) + * @param query - GAQL query string + */ + async searchStream( + customerId: string, + query: string, + ): Promise { + // searchStream returns array of response objects, we need to combine them + const responses = await this.request( + ENDPOINTS.SEARCH_STREAM(customerId), + { + method: "POST", + body: JSON.stringify({ + query: query.trim(), + }), + }, + ); + + // Combine all results from the stream + const combinedResults: GoogleAdsRow[] = []; + let fieldMask: string | undefined; + let requestId: string | undefined; + + if (Array.isArray(responses)) { + for (const response of responses) { + if (response.results) { + combinedResults.push(...response.results); + } + if (response.fieldMask) { + fieldMask = response.fieldMask; + } + if (response.requestId) { + requestId = response.requestId; + } + } + } + + return { + results: combinedResults, + fieldMask, + requestId, + }; + } + + // ==================== Account Methods ==================== + + /** + * List all accessible customers for the authenticated user + */ + async listAccessibleCustomers(): Promise { + return this.request( + ENDPOINTS.LIST_ACCESSIBLE_CUSTOMERS, + ); + } + + /** + * Get customer details using GAQL + * @param customerId - Customer ID (without hyphens) + */ + async getCustomer(customerId: string): Promise { + const response = await this.search(customerId, GAQL_QUERIES.GET_CUSTOMER); + return response.results?.[0]?.customer || null; + } + + // ==================== Campaign Methods ==================== + + /** + * List all campaigns for a customer + * @param customerId - Customer ID + * @param statusFilter - Optional status filter + */ + async listCampaigns( + customerId: string, + statusFilter?: CampaignStatus, + ): Promise { + let query = GAQL_QUERIES.LIST_CAMPAIGNS; + + if (statusFilter) { + query = ` + SELECT + campaign.id, + campaign.name, + campaign.status, + campaign.advertising_channel_type, + campaign.advertising_channel_sub_type, + campaign.bidding_strategy_type, + campaign.start_date, + campaign.end_date, + campaign.campaign_budget, + campaign.serving_status + FROM campaign + WHERE campaign.status = '${statusFilter}' + ORDER BY campaign.name + `; + } + + const response = await this.searchStream(customerId, query); + return response.results + .filter( + (row): row is GoogleAdsRow & { campaign: Campaign } => !!row.campaign, + ) + .map((row) => row.campaign); + } + + /** + * Get a specific campaign by ID + * @param customerId - Customer ID + * @param campaignId - Campaign ID + */ + async getCampaign( + customerId: string, + campaignId: string, + ): Promise { + const query = ` + SELECT + campaign.id, + campaign.name, + campaign.status, + campaign.advertising_channel_type, + campaign.advertising_channel_sub_type, + campaign.bidding_strategy_type, + campaign.start_date, + campaign.end_date, + campaign.campaign_budget, + campaign.serving_status, + campaign.network_settings.target_google_search, + campaign.network_settings.target_search_network, + campaign.network_settings.target_content_network + FROM campaign + WHERE campaign.id = ${campaignId} + `; + + const response = await this.search(customerId, query); + return response.results?.[0]?.campaign || null; + } + + /** + * Create a campaign budget + * @param customerId - Customer ID + * @param input - Budget creation input + */ + async createCampaignBudget( + customerId: string, + input: CreateCampaignBudgetInput, + ): Promise { + const operation = { + create: { + name: input.name, + amountMicros: input.amountMicros, + deliveryMethod: input.deliveryMethod || "STANDARD", + explicitlyShared: input.explicitlyShared ?? false, + }, + }; + + return this.request( + ENDPOINTS.CAMPAIGN_BUDGETS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [operation], + }), + }, + ); + } + + /** + * Create a new campaign + * @param customerId - Customer ID + * @param input - Campaign creation input + */ + async createCampaign( + customerId: string, + input: CreateCampaignInput, + ): Promise { + const campaign: Record = { + name: input.name, + advertisingChannelType: input.advertisingChannelType, + status: input.status || "PAUSED", + campaignBudget: input.campaignBudget, + }; + + if (input.startDate) { + campaign.startDate = input.startDate; + } + if (input.endDate) { + campaign.endDate = input.endDate; + } + if (input.networkSettings) { + campaign.networkSettings = input.networkSettings; + } + if (input.manualCpc) { + campaign.manualCpc = input.manualCpc; + } + if (input.targetCpaMicros) { + campaign.targetCpa = { targetCpaMicros: input.targetCpaMicros }; + } + if (input.targetRoas) { + campaign.targetRoas = { targetRoas: input.targetRoas }; + } + + return this.request( + ENDPOINTS.CAMPAIGNS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ create: campaign }], + }), + }, + ); + } + + /** + * Update an existing campaign + * @param customerId - Customer ID + * @param input - Campaign update input + */ + async updateCampaign( + customerId: string, + input: UpdateCampaignInput, + ): Promise { + const campaign: Record = { + resourceName: input.resourceName, + }; + const updateMask: string[] = []; + + if (input.name !== undefined) { + campaign.name = input.name; + updateMask.push("name"); + } + if (input.status !== undefined) { + campaign.status = input.status; + updateMask.push("status"); + } + if (input.startDate !== undefined) { + campaign.startDate = input.startDate; + updateMask.push("start_date"); + } + if (input.endDate !== undefined) { + campaign.endDate = input.endDate; + updateMask.push("end_date"); + } + if (input.networkSettings !== undefined) { + campaign.networkSettings = input.networkSettings; + updateMask.push("network_settings"); + } + if (input.targetCpaMicros !== undefined) { + campaign.targetCpa = { targetCpaMicros: input.targetCpaMicros }; + updateMask.push("target_cpa.target_cpa_micros"); + } + if (input.targetRoas !== undefined) { + campaign.targetRoas = { targetRoas: input.targetRoas }; + updateMask.push("target_roas.target_roas"); + } + + return this.request( + ENDPOINTS.CAMPAIGNS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [ + { + update: campaign, + updateMask: updateMask.join(","), + }, + ], + }), + }, + ); + } + + /** + * Update campaign status (pause, enable, remove) + * @param customerId - Customer ID + * @param campaignResourceName - Campaign resource name + * @param status - New status + */ + async updateCampaignStatus( + customerId: string, + campaignResourceName: string, + status: CampaignStatus, + ): Promise { + return this.updateCampaign(customerId, { + resourceName: campaignResourceName, + status, + }); + } + + // ==================== Ad Group Methods ==================== + + /** + * List ad groups for a customer + * @param customerId - Customer ID + * @param campaignId - Optional campaign ID to filter by + */ + async listAdGroups( + customerId: string, + campaignId?: string, + ): Promise { + const query = campaignId + ? GAQL_QUERIES.LIST_AD_GROUPS_BY_CAMPAIGN(campaignId) + : GAQL_QUERIES.LIST_AD_GROUPS; + + const response = await this.searchStream(customerId, query); + return response.results + .filter( + (row): row is GoogleAdsRow & { adGroup: AdGroup } => !!row.adGroup, + ) + .map((row) => row.adGroup); + } + + /** + * Get a specific ad group by ID + * @param customerId - Customer ID + * @param adGroupId - Ad group ID + */ + async getAdGroup( + customerId: string, + adGroupId: string, + ): Promise { + const query = ` + SELECT + ad_group.id, + ad_group.name, + ad_group.campaign, + ad_group.status, + ad_group.type, + ad_group.cpc_bid_micros, + ad_group.cpm_bid_micros, + ad_group.target_cpa_micros + FROM ad_group + WHERE ad_group.id = ${adGroupId} + `; + + const response = await this.search(customerId, query); + return response.results?.[0]?.adGroup || null; + } + + /** + * Create a new ad group + * @param customerId - Customer ID + * @param input - Ad group creation input + */ + async createAdGroup( + customerId: string, + input: CreateAdGroupInput, + ): Promise { + const adGroup: Record = { + name: input.name, + campaign: input.campaign, + status: input.status || "PAUSED", + }; + + if (input.type) { + adGroup.type = input.type; + } + if (input.cpcBidMicros) { + adGroup.cpcBidMicros = input.cpcBidMicros; + } + if (input.cpmBidMicros) { + adGroup.cpmBidMicros = input.cpmBidMicros; + } + if (input.targetCpaMicros) { + adGroup.targetCpaMicros = input.targetCpaMicros; + } + + return this.request( + ENDPOINTS.AD_GROUPS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ create: adGroup }], + }), + }, + ); + } + + /** + * Update an existing ad group + * @param customerId - Customer ID + * @param input - Ad group update input + */ + async updateAdGroup( + customerId: string, + input: UpdateAdGroupInput, + ): Promise { + const adGroup: Record = { + resourceName: input.resourceName, + }; + const updateMask: string[] = []; + + if (input.name !== undefined) { + adGroup.name = input.name; + updateMask.push("name"); + } + if (input.status !== undefined) { + adGroup.status = input.status; + updateMask.push("status"); + } + if (input.cpcBidMicros !== undefined) { + adGroup.cpcBidMicros = input.cpcBidMicros; + updateMask.push("cpc_bid_micros"); + } + if (input.cpmBidMicros !== undefined) { + adGroup.cpmBidMicros = input.cpmBidMicros; + updateMask.push("cpm_bid_micros"); + } + if (input.targetCpaMicros !== undefined) { + adGroup.targetCpaMicros = input.targetCpaMicros; + updateMask.push("target_cpa_micros"); + } + + return this.request( + ENDPOINTS.AD_GROUPS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [ + { + update: adGroup, + updateMask: updateMask.join(","), + }, + ], + }), + }, + ); + } + + /** + * Update ad group status + * @param customerId - Customer ID + * @param adGroupResourceName - Ad group resource name + * @param status - New status + */ + async updateAdGroupStatus( + customerId: string, + adGroupResourceName: string, + status: AdGroupStatus, + ): Promise { + return this.updateAdGroup(customerId, { + resourceName: adGroupResourceName, + status, + }); + } + + // ==================== Ad Methods ==================== + + /** + * List ads for a customer + * @param customerId - Customer ID + * @param adGroupId - Optional ad group ID to filter by + */ + async listAds(customerId: string, adGroupId?: string): Promise { + const query = adGroupId + ? GAQL_QUERIES.LIST_ADS_BY_AD_GROUP(adGroupId) + : GAQL_QUERIES.LIST_ADS; + + const response = await this.searchStream(customerId, query); + return response.results + .filter( + (row): row is GoogleAdsRow & { adGroupAd: AdGroupAd } => + !!row.adGroupAd, + ) + .map((row) => row.adGroupAd); + } + + /** + * Get a specific ad by ID + * @param customerId - Customer ID + * @param adGroupId - Ad group ID + * @param adId - Ad ID + */ + async getAd( + customerId: string, + adGroupId: string, + adId: string, + ): Promise { + const query = ` + SELECT + ad_group_ad.ad.id, + ad_group_ad.ad.name, + ad_group_ad.ad.type, + ad_group_ad.ad.final_urls, + ad_group_ad.ad.display_url, + ad_group_ad.ad_group, + ad_group_ad.status, + ad_group_ad.policy_summary.approval_status, + ad_group_ad.ad.responsive_search_ad.headlines, + ad_group_ad.ad.responsive_search_ad.descriptions, + ad_group_ad.ad.responsive_search_ad.path1, + ad_group_ad.ad.responsive_search_ad.path2 + FROM ad_group_ad + WHERE ad_group.id = ${adGroupId} + AND ad_group_ad.ad.id = ${adId} + `; + + const response = await this.search(customerId, query); + return response.results?.[0]?.adGroupAd || null; + } + + /** + * Create a responsive search ad + * @param customerId - Customer ID + * @param input - Ad creation input + */ + async createResponsiveSearchAd( + customerId: string, + input: CreateResponsiveSearchAdInput, + ): Promise { + const adGroupAd = { + adGroup: input.adGroup, + status: input.status || "PAUSED", + ad: { + finalUrls: input.finalUrls, + responsiveSearchAd: { + headlines: input.headlines, + descriptions: input.descriptions, + path1: input.path1, + path2: input.path2, + }, + }, + }; + + return this.request( + ENDPOINTS.AD_GROUP_ADS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ create: adGroupAd }], + }), + }, + ); + } + + /** + * Update an ad (mainly status changes) + * @param customerId - Customer ID + * @param input - Ad update input + */ + async updateAdGroupAd( + customerId: string, + input: UpdateAdGroupAdInput, + ): Promise { + const adGroupAd: Record = { + resourceName: input.resourceName, + }; + const updateMask: string[] = []; + + if (input.status !== undefined) { + adGroupAd.status = input.status; + updateMask.push("status"); + } + + return this.request( + ENDPOINTS.AD_GROUP_ADS_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [ + { + update: adGroupAd, + updateMask: updateMask.join(","), + }, + ], + }), + }, + ); + } + + /** + * Update ad status + * @param customerId - Customer ID + * @param adResourceName - Ad resource name + * @param status - New status + */ + async updateAdStatus( + customerId: string, + adResourceName: string, + status: AdGroupAdStatus, + ): Promise { + return this.updateAdGroupAd(customerId, { + resourceName: adResourceName, + status, + }); + } + + // ==================== Keyword Methods ==================== + + /** + * List keywords for a customer + * @param customerId - Customer ID + * @param adGroupId - Optional ad group ID to filter by + */ + async listKeywords( + customerId: string, + adGroupId?: string, + ): Promise { + const query = adGroupId + ? GAQL_QUERIES.LIST_KEYWORDS_BY_AD_GROUP(adGroupId) + : GAQL_QUERIES.LIST_KEYWORDS; + + const response = await this.searchStream(customerId, query); + return response.results + .filter( + (row): row is GoogleAdsRow & { adGroupCriterion: AdGroupCriterion } => + !!row.adGroupCriterion, + ) + .map((row) => row.adGroupCriterion); + } + + /** + * Get a specific keyword by criterion ID + * @param customerId - Customer ID + * @param adGroupId - Ad group ID + * @param criterionId - Criterion ID + */ + async getKeyword( + customerId: string, + adGroupId: string, + criterionId: string, + ): Promise { + const query = ` + SELECT + ad_group_criterion.criterion_id, + ad_group_criterion.ad_group, + ad_group_criterion.keyword.text, + ad_group_criterion.keyword.match_type, + ad_group_criterion.status, + ad_group_criterion.cpc_bid_micros, + ad_group_criterion.negative, + ad_group_criterion.quality_info.quality_score, + ad_group_criterion.position_estimates.first_page_cpc_micros, + ad_group_criterion.position_estimates.top_of_page_cpc_micros + FROM ad_group_criterion + WHERE ad_group.id = ${adGroupId} + AND ad_group_criterion.criterion_id = ${criterionId} + AND ad_group_criterion.type = 'KEYWORD' + `; + + const response = await this.search(customerId, query); + return response.results?.[0]?.adGroupCriterion || null; + } + + /** + * Create a new keyword + * @param customerId - Customer ID + * @param input - Keyword creation input + */ + async createKeyword( + customerId: string, + input: CreateKeywordInput, + ): Promise { + const criterion: Record = { + adGroup: input.adGroup, + status: input.status || "ENABLED", + keyword: { + text: input.keyword.text, + matchType: input.keyword.matchType, + }, + }; + + if (input.cpcBidMicros) { + criterion.cpcBidMicros = input.cpcBidMicros; + } + if (input.finalUrls) { + criterion.finalUrls = input.finalUrls; + } + if (input.negative !== undefined) { + criterion.negative = input.negative; + } + + return this.request( + ENDPOINTS.AD_GROUP_CRITERIA_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ create: criterion }], + }), + }, + ); + } + + /** + * Update an existing keyword + * @param customerId - Customer ID + * @param input - Keyword update input + */ + async updateKeyword( + customerId: string, + input: UpdateKeywordInput, + ): Promise { + const criterion: Record = { + resourceName: input.resourceName, + }; + const updateMask: string[] = []; + + if (input.status !== undefined) { + criterion.status = input.status; + updateMask.push("status"); + } + if (input.cpcBidMicros !== undefined) { + criterion.cpcBidMicros = input.cpcBidMicros; + updateMask.push("cpc_bid_micros"); + } + if (input.finalUrls !== undefined) { + criterion.finalUrls = input.finalUrls; + updateMask.push("final_urls"); + } + + return this.request( + ENDPOINTS.AD_GROUP_CRITERIA_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [ + { + update: criterion, + updateMask: updateMask.join(","), + }, + ], + }), + }, + ); + } + + /** + * Update keyword status + * @param customerId - Customer ID + * @param keywordResourceName - Keyword resource name + * @param status - New status + */ + async updateKeywordStatus( + customerId: string, + keywordResourceName: string, + status: AdGroupCriterionStatus, + ): Promise { + return this.updateKeyword(customerId, { + resourceName: keywordResourceName, + status, + }); + } + + /** + * Remove a keyword + * @param customerId - Customer ID + * @param keywordResourceName - Keyword resource name + */ + async removeKeyword( + customerId: string, + keywordResourceName: string, + ): Promise { + return this.request( + ENDPOINTS.AD_GROUP_CRITERIA_MUTATE(customerId), + { + method: "POST", + body: JSON.stringify({ + operations: [{ remove: keywordResourceName }], + }), + }, + ); + } + + // ==================== Report Methods ==================== + + /** + * Get account performance report + * @param customerId - Customer ID + * @param dateRange - Date range preset (e.g., LAST_30_DAYS) + */ + async getAccountPerformance( + customerId: string, + dateRange: string, + ): Promise { + const query = GAQL_QUERIES.ACCOUNT_PERFORMANCE_REPORT(dateRange); + const response = await this.search(customerId, query); + return response.results || []; + } + + /** + * Get campaign performance report + * @param customerId - Customer ID + * @param dateRange - Date range preset + * @param campaignId - Optional campaign ID to filter + */ + async getCampaignPerformance( + customerId: string, + dateRange: string, + campaignId?: string, + ): Promise { + let query = GAQL_QUERIES.CAMPAIGN_PERFORMANCE_REPORT(dateRange); + + if (campaignId) { + query = ` + SELECT + campaign.id, + campaign.name, + campaign.status, + segments.date, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.conversions_value, + metrics.ctr, + metrics.average_cpc + FROM campaign + WHERE campaign.id = ${campaignId} + AND segments.date DURING ${dateRange} + ORDER BY segments.date DESC + `; + } + + const response = await this.searchStream(customerId, query); + return response.results || []; + } + + /** + * Get ad group performance report + * @param customerId - Customer ID + * @param dateRange - Date range preset + * @param campaignId - Optional campaign ID to filter + */ + async getAdGroupPerformance( + customerId: string, + dateRange: string, + campaignId?: string, + ): Promise { + let whereClause = `segments.date DURING ${dateRange}`; + if (campaignId) { + whereClause += ` AND campaign.id = ${campaignId}`; + } + + const query = ` + SELECT + ad_group.id, + ad_group.name, + ad_group.campaign, + ad_group.status, + segments.date, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.ctr, + metrics.average_cpc + FROM ad_group + WHERE ${whereClause} + ORDER BY segments.date DESC + `; + + const response = await this.searchStream(customerId, query); + return response.results || []; + } + + /** + * Get keyword performance report + * @param customerId - Customer ID + * @param dateRange - Date range preset + * @param adGroupId - Optional ad group ID to filter + */ + async getKeywordPerformance( + customerId: string, + dateRange: string, + adGroupId?: string, + ): Promise { + let whereClause = `ad_group_criterion.type = 'KEYWORD' AND segments.date DURING ${dateRange}`; + if (adGroupId) { + whereClause += ` AND ad_group.id = ${adGroupId}`; + } + + const query = ` + SELECT + ad_group_criterion.criterion_id, + ad_group_criterion.keyword.text, + ad_group_criterion.keyword.match_type, + ad_group_criterion.status, + ad_group.name, + segments.date, + metrics.impressions, + metrics.clicks, + metrics.cost_micros, + metrics.conversions, + metrics.ctr, + metrics.average_cpc, + ad_group_criterion.quality_info.quality_score + FROM ad_group_criterion + WHERE ${whereClause} + ORDER BY metrics.impressions DESC + `; + + const response = await this.searchStream(customerId, query); + return response.results || []; + } +} + +// Re-export getGoogleAccessToken from env.ts for convenience +export { getGoogleAccessToken as getAccessToken } from "./env.ts"; diff --git a/google-ads/server/lib/types.ts b/google-ads/server/lib/types.ts new file mode 100644 index 00000000..ede05be6 --- /dev/null +++ b/google-ads/server/lib/types.ts @@ -0,0 +1,906 @@ +/** + * Google Ads API types + * Based on Google Ads API v18 specification + */ + +// ============================================================================ +// Enums and Status Types +// ============================================================================ + +/** + * Campaign status + */ +export type CampaignStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "ENABLED" + | "PAUSED" + | "REMOVED"; + +/** + * Ad group status + */ +export type AdGroupStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "ENABLED" + | "PAUSED" + | "REMOVED"; + +/** + * Ad group ad status + */ +export type AdGroupAdStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "ENABLED" + | "PAUSED" + | "REMOVED"; + +/** + * Keyword match type + */ +export type KeywordMatchType = + | "UNSPECIFIED" + | "UNKNOWN" + | "EXACT" + | "PHRASE" + | "BROAD"; + +/** + * Keyword status + */ +export type AdGroupCriterionStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "ENABLED" + | "PAUSED" + | "REMOVED"; + +/** + * Advertising channel type + */ +export type AdvertisingChannelType = + | "UNSPECIFIED" + | "UNKNOWN" + | "SEARCH" + | "DISPLAY" + | "SHOPPING" + | "HOTEL" + | "VIDEO" + | "MULTI_CHANNEL" + | "LOCAL" + | "SMART" + | "PERFORMANCE_MAX" + | "LOCAL_SERVICES" + | "DISCOVERY" + | "TRAVEL" + | "DEMAND_GEN"; + +/** + * Advertising channel sub type + */ +export type AdvertisingChannelSubType = + | "UNSPECIFIED" + | "UNKNOWN" + | "SEARCH_MOBILE_APP" + | "DISPLAY_MOBILE_APP" + | "SEARCH_EXPRESS" + | "DISPLAY_EXPRESS" + | "SHOPPING_SMART_ADS" + | "DISPLAY_GMAIL_AD" + | "DISPLAY_SMART_CAMPAIGN" + | "VIDEO_OUTSTREAM" + | "VIDEO_ACTION" + | "VIDEO_NON_SKIPPABLE" + | "APP_CAMPAIGN" + | "APP_CAMPAIGN_FOR_ENGAGEMENT" + | "LOCAL_CAMPAIGN" + | "SHOPPING_COMPARISON_LISTING_ADS" + | "SMART_CAMPAIGN" + | "VIDEO_SEQUENCE" + | "APP_CAMPAIGN_FOR_PRE_REGISTRATION" + | "VIDEO_REACH_TARGET_FREQUENCY" + | "TRAVEL_ACTIVITIES" + | "SOCIAL"; + +/** + * Bidding strategy type + */ +export type BiddingStrategyType = + | "UNSPECIFIED" + | "UNKNOWN" + | "COMMISSION" + | "ENHANCED_CPC" + | "INVALID" + | "MANUAL_CPA" + | "MANUAL_CPC" + | "MANUAL_CPM" + | "MANUAL_CPV" + | "MAXIMIZE_CONVERSIONS" + | "MAXIMIZE_CONVERSION_VALUE" + | "PAGE_ONE_PROMOTED" + | "PERCENT_CPC" + | "TARGET_CPA" + | "TARGET_CPM" + | "TARGET_IMPRESSION_SHARE" + | "TARGET_OUTRANK_SHARE" + | "TARGET_ROAS" + | "TARGET_SPEND"; + +/** + * Ad type + */ +export type AdType = + | "UNSPECIFIED" + | "UNKNOWN" + | "TEXT_AD" + | "EXPANDED_TEXT_AD" + | "CALL_ONLY_AD" + | "EXPANDED_DYNAMIC_SEARCH_AD" + | "HOTEL_AD" + | "SHOPPING_SMART_AD" + | "SHOPPING_PRODUCT_AD" + | "VIDEO_AD" + | "GMAIL_AD" + | "IMAGE_AD" + | "RESPONSIVE_SEARCH_AD" + | "LEGACY_RESPONSIVE_DISPLAY_AD" + | "APP_AD" + | "LEGACY_APP_INSTALL_AD" + | "RESPONSIVE_DISPLAY_AD" + | "LOCAL_AD" + | "HTML5_UPLOAD_AD" + | "DYNAMIC_HTML5_AD" + | "APP_ENGAGEMENT_AD" + | "SHOPPING_COMPARISON_LISTING_AD" + | "VIDEO_BUMPER_AD" + | "VIDEO_NON_SKIPPABLE_IN_STREAM_AD" + | "VIDEO_OUTSTREAM_AD" + | "VIDEO_TRUEVIEW_DISCOVERY_AD" + | "VIDEO_TRUEVIEW_IN_STREAM_AD" + | "VIDEO_RESPONSIVE_AD" + | "SMART_CAMPAIGN_AD" + | "APP_PRE_REGISTRATION_AD" + | "DISCOVERY_MULTI_ASSET_AD" + | "DISCOVERY_CAROUSEL_AD" + | "DISCOVERY_VIDEO_RESPONSIVE_AD" + | "TRAVEL_AD" + | "DEMAND_GEN_PRODUCT_AD" + | "DEMAND_GEN_MULTI_ASSET_AD" + | "DEMAND_GEN_CAROUSEL_AD" + | "DEMAND_GEN_VIDEO_RESPONSIVE_AD"; + +/** + * Budget delivery method + */ +export type BudgetDeliveryMethod = + | "UNSPECIFIED" + | "UNKNOWN" + | "STANDARD" + | "ACCELERATED"; + +/** + * Campaign serving status + */ +export type CampaignServingStatus = + | "UNSPECIFIED" + | "UNKNOWN" + | "SERVING" + | "NONE" + | "ENDED" + | "PENDING" + | "SUSPENDED"; + +// ============================================================================ +// Resource Types +// ============================================================================ + +/** + * Customer account + */ +export interface Customer { + resourceName: string; + id: string; + descriptiveName: string; + currencyCode: string; + timeZone: string; + trackingUrlTemplate?: string; + finalUrlSuffix?: string; + autoTaggingEnabled?: boolean; + hasPartnersBadge?: boolean; + manager?: boolean; + testAccount?: boolean; + conversionTrackingId?: string; + remarketingId?: string; +} + +/** + * Accessible customer (for list accessible customers) + */ +export interface AccessibleCustomer { + resourceName: string; +} + +/** + * Campaign budget + */ +export interface CampaignBudget { + resourceName: string; + id: string; + name: string; + amountMicros: string; + deliveryMethod: BudgetDeliveryMethod; + explicitlyShared?: boolean; + referenceCount?: string; + totalAmountMicros?: string; + status?: "UNSPECIFIED" | "UNKNOWN" | "ENABLED" | "REMOVED"; +} + +/** + * Campaign + */ +export interface Campaign { + resourceName: string; + id: string; + name: string; + status: CampaignStatus; + servingStatus?: CampaignServingStatus; + advertisingChannelType: AdvertisingChannelType; + advertisingChannelSubType?: AdvertisingChannelSubType; + biddingStrategyType?: BiddingStrategyType; + startDate?: string; + endDate?: string; + campaignBudget?: string; + targetCpa?: { + targetCpaMicros?: string; + cpcBidCeilingMicros?: string; + cpcBidFloorMicros?: string; + }; + targetRoas?: { + targetRoas?: number; + cpcBidCeilingMicros?: string; + cpcBidFloorMicros?: string; + }; + maximizeConversions?: { + targetCpaMicros?: string; + cpcBidCeilingMicros?: string; + cpcBidFloorMicros?: string; + }; + maximizeConversionValue?: { + targetRoas?: number; + cpcBidCeilingMicros?: string; + cpcBidFloorMicros?: string; + }; + manualCpc?: { + enhancedCpcEnabled?: boolean; + }; + manualCpm?: Record; + targetSpend?: { + targetSpendMicros?: string; + cpcBidCeilingMicros?: string; + }; + networkSettings?: { + targetGoogleSearch?: boolean; + targetSearchNetwork?: boolean; + targetContentNetwork?: boolean; + targetPartnerSearchNetwork?: boolean; + }; + geoTargetTypeSetting?: { + positiveGeoTargetType?: string; + negativeGeoTargetType?: string; + }; + urlCustomParameters?: Array<{ + key: string; + value: string; + }>; + trackingUrlTemplate?: string; + finalUrlSuffix?: string; + labels?: string[]; +} + +/** + * Ad group + */ +export interface AdGroup { + resourceName: string; + id: string; + name: string; + campaign: string; + status: AdGroupStatus; + type?: AdGroupType; + cpcBidMicros?: string; + cpmBidMicros?: string; + targetCpaMicros?: string; + targetRoas?: number; + percentCpcBidMicros?: string; + effectiveTargetCpaMicros?: string; + effectiveTargetRoas?: number; + labels?: string[]; + trackingUrlTemplate?: string; + urlCustomParameters?: Array<{ + key: string; + value: string; + }>; + finalUrlSuffix?: string; +} + +/** + * Ad group type + */ +export type AdGroupType = + | "UNSPECIFIED" + | "UNKNOWN" + | "SEARCH_STANDARD" + | "DISPLAY_STANDARD" + | "SHOPPING_PRODUCT_ADS" + | "HOTEL_ADS" + | "SHOPPING_SMART_ADS" + | "VIDEO_BUMPER" + | "VIDEO_TRUE_VIEW_IN_STREAM" + | "VIDEO_TRUE_VIEW_IN_DISPLAY" + | "VIDEO_NON_SKIPPABLE_IN_STREAM" + | "VIDEO_OUTSTREAM" + | "SEARCH_DYNAMIC_ADS" + | "SHOPPING_COMPARISON_LISTING_ADS" + | "PROMOTED_HOTEL_ADS" + | "VIDEO_RESPONSIVE" + | "VIDEO_EFFICIENT_REACH" + | "SMART_CAMPAIGN_ADS" + | "TRAVEL_ADS"; + +/** + * Ad - containing the ad details + */ +export interface Ad { + resourceName: string; + id: string; + type: AdType; + finalUrls?: string[]; + finalMobileUrls?: string[]; + displayUrl?: string; + trackingUrlTemplate?: string; + urlCustomParameters?: Array<{ + key: string; + value: string; + }>; + finalUrlSuffix?: string; + name?: string; + responsiveSearchAd?: ResponsiveSearchAd; + responsiveDisplayAd?: ResponsiveDisplayAd; + expandedTextAd?: ExpandedTextAd; +} + +/** + * Responsive search ad + */ +export interface ResponsiveSearchAd { + headlines: Array<{ + text: string; + pinnedField?: + | "UNSPECIFIED" + | "UNKNOWN" + | "HEADLINE_1" + | "HEADLINE_2" + | "HEADLINE_3"; + }>; + descriptions: Array<{ + text: string; + pinnedField?: "UNSPECIFIED" | "UNKNOWN" | "DESCRIPTION_1" | "DESCRIPTION_2"; + }>; + path1?: string; + path2?: string; +} + +/** + * Responsive display ad + */ +export interface ResponsiveDisplayAd { + marketingImages?: Array<{ + asset: string; + }>; + squareMarketingImages?: Array<{ + asset: string; + }>; + logoImages?: Array<{ + asset: string; + }>; + squareLogoImages?: Array<{ + asset: string; + }>; + headlines: Array<{ + text: string; + }>; + longHeadline: { + text: string; + }; + descriptions: Array<{ + text: string; + }>; + businessName: string; + callToActionText?: string; + mainColor?: string; + accentColor?: string; +} + +/** + * Expanded text ad (legacy) + */ +export interface ExpandedTextAd { + headlinePart1: string; + headlinePart2: string; + headlinePart3?: string; + description: string; + description2?: string; + path1?: string; + path2?: string; +} + +/** + * Ad group ad (combination of ad group and ad) + */ +export interface AdGroupAd { + resourceName: string; + adGroup: string; + ad: Ad; + status: AdGroupAdStatus; + policySummary?: { + approvalStatus?: string; + policyTopicEntries?: Array<{ + topic?: string; + type?: string; + }>; + reviewStatus?: string; + }; + labels?: string[]; +} + +/** + * Keyword criterion + */ +export interface KeywordInfo { + text: string; + matchType: KeywordMatchType; +} + +/** + * Ad group criterion (includes keywords) + */ +export interface AdGroupCriterion { + resourceName: string; + criterionId: string; + adGroup: string; + status: AdGroupCriterionStatus; + type?: + | "UNSPECIFIED" + | "UNKNOWN" + | "KEYWORD" + | "PLACEMENT" + | "MOBILE_APP_CATEGORY" + | "MOBILE_APPLICATION" + | "DEVICE" + | "LOCATION" + | "LISTING_GROUP" + | "AD_SCHEDULE" + | "AGE_RANGE" + | "GENDER" + | "INCOME_RANGE" + | "PARENTAL_STATUS" + | "YOUTUBE_VIDEO" + | "YOUTUBE_CHANNEL" + | "USER_LIST" + | "PROXIMITY" + | "TOPIC" + | "LISTING_SCOPE" + | "LANGUAGE" + | "IP_BLOCK" + | "CONTENT_LABEL" + | "CARRIER" + | "USER_INTEREST" + | "WEBPAGE" + | "OPERATING_SYSTEM_VERSION" + | "APP_PAYMENT_MODEL" + | "MOBILE_DEVICE" + | "CUSTOM_AFFINITY" + | "CUSTOM_INTENT" + | "LOCATION_GROUP" + | "CUSTOM_AUDIENCE" + | "COMBINED_AUDIENCE" + | "KEYWORD_THEME" + | "AUDIENCE" + | "LOCAL_SERVICE_ID" + | "BRAND" + | "BRAND_LIST" + | "LIFE_EVENT" + | "SEARCH_THEME"; + keyword?: KeywordInfo; + bidModifier?: number; + cpcBidMicros?: string; + effectiveCpcBidMicros?: string; + qualityInfo?: { + qualityScore?: number; + creativenessScore?: + | "UNSPECIFIED" + | "UNKNOWN" + | "BELOW_AVERAGE" + | "AVERAGE" + | "ABOVE_AVERAGE"; + postClickQualityScore?: + | "UNSPECIFIED" + | "UNKNOWN" + | "BELOW_AVERAGE" + | "AVERAGE" + | "ABOVE_AVERAGE"; + searchPredictedCtr?: + | "UNSPECIFIED" + | "UNKNOWN" + | "BELOW_AVERAGE" + | "AVERAGE" + | "ABOVE_AVERAGE"; + }; + positionEstimates?: { + firstPageCpcMicros?: string; + firstPositionCpcMicros?: string; + topOfPageCpcMicros?: string; + }; + finalUrls?: string[]; + finalMobileUrls?: string[]; + trackingUrlTemplate?: string; + urlCustomParameters?: Array<{ + key: string; + value: string; + }>; + finalUrlSuffix?: string; + labels?: string[]; + negative?: boolean; +} + +// ============================================================================ +// API Response Types +// ============================================================================ + +/** + * List accessible customers response + */ +export interface ListAccessibleCustomersResponse { + resourceNames: string[]; +} + +/** + * Search stream response row (contains selected resources) + */ +export interface GoogleAdsRow { + customer?: Customer; + campaign?: Campaign; + campaignBudget?: CampaignBudget; + adGroup?: AdGroup; + adGroupAd?: AdGroupAd; + adGroupCriterion?: AdGroupCriterion; + metrics?: Metrics; + segments?: Segments; +} + +/** + * Search response + */ +export interface SearchGoogleAdsResponse { + results: GoogleAdsRow[]; + nextPageToken?: string; + totalResultsCount?: string; + fieldMask?: string; +} + +/** + * Search stream response + */ +export interface SearchGoogleAdsStreamResponse { + results: GoogleAdsRow[]; + fieldMask?: string; + requestId?: string; +} + +// ============================================================================ +// Metrics Types +// ============================================================================ + +/** + * Metrics (performance data) + */ +export interface Metrics { + impressions?: string; + clicks?: string; + costMicros?: string; + conversions?: number; + conversionsValue?: number; + ctr?: number; + averageCpc?: number; + averageCpm?: number; + averageCost?: number; + allConversions?: number; + allConversionsValue?: number; + viewThroughConversions?: string; + interactionRate?: number; + interactions?: string; + engagementRate?: number; + engagements?: string; + videoViews?: string; + videoViewRate?: number; + averageCpv?: number; + absoluteTopImpressionPercentage?: number; + topImpressionPercentage?: number; + searchImpressionShare?: number; + searchRankLostImpressionShare?: number; + searchBudgetLostImpressionShare?: number; + contentImpressionShare?: number; + contentRankLostImpressionShare?: number; + contentBudgetLostImpressionShare?: number; +} + +/** + * Segments (for breakdown) + */ +export interface Segments { + date?: string; + dayOfWeek?: + | "UNSPECIFIED" + | "UNKNOWN" + | "MONDAY" + | "TUESDAY" + | "WEDNESDAY" + | "THURSDAY" + | "FRIDAY" + | "SATURDAY" + | "SUNDAY"; + device?: + | "UNSPECIFIED" + | "UNKNOWN" + | "MOBILE" + | "TABLET" + | "DESKTOP" + | "CONNECTED_TV" + | "OTHER"; + hour?: number; + month?: string; + quarter?: string; + week?: string; + year?: number; + adNetworkType?: + | "UNSPECIFIED" + | "UNKNOWN" + | "SEARCH" + | "SEARCH_PARTNERS" + | "CONTENT" + | "YOUTUBE_SEARCH" + | "YOUTUBE_WATCH" + | "MIXED" + | "GOOGLE_TV"; + conversionAction?: string; + conversionActionCategory?: string; + conversionActionName?: string; + geoTargetCity?: string; + geoTargetCountry?: string; + geoTargetMetro?: string; + geoTargetRegion?: string; +} + +// ============================================================================ +// Input Types (for mutations) +// ============================================================================ + +/** + * Input for creating a campaign budget + */ +export interface CreateCampaignBudgetInput { + name: string; + amountMicros: string; + deliveryMethod?: BudgetDeliveryMethod; + explicitlyShared?: boolean; +} + +/** + * Input for creating a campaign + */ +export interface CreateCampaignInput { + name: string; + advertisingChannelType: AdvertisingChannelType; + status?: CampaignStatus; + campaignBudget: string; + startDate?: string; + endDate?: string; + biddingStrategyType?: BiddingStrategyType; + targetCpaMicros?: string; + targetRoas?: number; + manualCpc?: { + enhancedCpcEnabled?: boolean; + }; + networkSettings?: { + targetGoogleSearch?: boolean; + targetSearchNetwork?: boolean; + targetContentNetwork?: boolean; + targetPartnerSearchNetwork?: boolean; + }; +} + +/** + * Input for updating a campaign + */ +export interface UpdateCampaignInput { + resourceName: string; + name?: string; + status?: CampaignStatus; + startDate?: string; + endDate?: string; + targetCpaMicros?: string; + targetRoas?: number; + networkSettings?: { + targetGoogleSearch?: boolean; + targetSearchNetwork?: boolean; + targetContentNetwork?: boolean; + targetPartnerSearchNetwork?: boolean; + }; +} + +/** + * Input for creating an ad group + */ +export interface CreateAdGroupInput { + name: string; + campaign: string; + status?: AdGroupStatus; + type?: AdGroupType; + cpcBidMicros?: string; + cpmBidMicros?: string; + targetCpaMicros?: string; +} + +/** + * Input for updating an ad group + */ +export interface UpdateAdGroupInput { + resourceName: string; + name?: string; + status?: AdGroupStatus; + cpcBidMicros?: string; + cpmBidMicros?: string; + targetCpaMicros?: string; +} + +/** + * Input for creating a responsive search ad + */ +export interface CreateResponsiveSearchAdInput { + adGroup: string; + status?: AdGroupAdStatus; + finalUrls: string[]; + headlines: Array<{ + text: string; + }>; + descriptions: Array<{ + text: string; + }>; + path1?: string; + path2?: string; +} + +/** + * Input for updating an ad + */ +export interface UpdateAdGroupAdInput { + resourceName: string; + status?: AdGroupAdStatus; +} + +/** + * Input for creating a keyword + */ +export interface CreateKeywordInput { + adGroup: string; + status?: AdGroupCriterionStatus; + keyword: { + text: string; + matchType: KeywordMatchType; + }; + cpcBidMicros?: string; + finalUrls?: string[]; + negative?: boolean; +} + +/** + * Input for updating a keyword + */ +export interface UpdateKeywordInput { + resourceName: string; + status?: AdGroupCriterionStatus; + cpcBidMicros?: string; + finalUrls?: string[]; +} + +// ============================================================================ +// Mutation Response Types +// ============================================================================ + +/** + * Mutate operation result + */ +export interface MutateOperationResult { + resourceName: string; +} + +/** + * Mutate campaign response + */ +export interface MutateCampaignsResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +/** + * Mutate campaign budgets response + */ +export interface MutateCampaignBudgetsResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +/** + * Mutate ad groups response + */ +export interface MutateAdGroupsResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +/** + * Mutate ad group ads response + */ +export interface MutateAdGroupAdsResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +/** + * Mutate ad group criteria response + */ +export interface MutateAdGroupCriteriaResponse { + results: MutateOperationResult[]; + partialFailureError?: GoogleAdsError; +} + +// ============================================================================ +// Error Types +// ============================================================================ + +/** + * Google Ads API error + */ +export interface GoogleAdsError { + errors: Array<{ + errorCode?: Record; + message?: string; + trigger?: { + stringValue?: string; + }; + location?: { + fieldPathElements?: Array<{ + fieldName?: string; + index?: number; + }>; + }; + }>; + message?: string; +} + +/** + * API error response + */ +export interface ApiErrorResponse { + error: { + code: number; + message: string; + status: string; + details?: Array<{ + "@type": string; + errors?: GoogleAdsError["errors"]; + }>; + }; +} diff --git a/google-ads/server/main.ts b/google-ads/server/main.ts new file mode 100644 index 00000000..eebfb495 --- /dev/null +++ b/google-ads/server/main.ts @@ -0,0 +1,125 @@ +/** + * Google Ads MCP Server + * + * This MCP provides tools for interacting with Google Ads API v18, + * including campaign, ad group, ad, and keyword management, + * as well as performance reporting. + */ +import { withRuntime } from "@decocms/runtime"; +import { serve } from "@decocms/mcps-shared/serve"; + +import { tools } from "./tools/index.ts"; +import type { Env } from "../shared/deco.gen.ts"; + +export type { Env }; + +const GOOGLE_ADS_SCOPES = ["https://www.googleapis.com/auth/adwords"].join(" "); + +// Store the last used redirect_uri for token exchange +let lastRedirectUri: string | null = null; + +interface OAuthTokenResponse { + access_token: string; + refresh_token?: string; + expires_in?: number; + token_type: string; +} + +interface ExchangeCodeParams { + code: string; + code_verifier?: string; + code_challenge_method?: string; +} + +const runtime = withRuntime({ + tools: (env: Env) => tools.map((createTool) => createTool(env)), + oauth: { + mode: "PKCE", + // Used in protected resource metadata to point to the auth server + authorizationServer: "https://accounts.google.com", + + // Generates the URL to redirect users to for authorization + authorizationUrl: (callbackUrl) => { + // Parse the callback URL to extract base URL and state parameter + // Google OAuth doesn't allow 'state' inside redirect_uri + const callbackUrlObj = new URL(callbackUrl); + const state = callbackUrlObj.searchParams.get("state"); + + // Remove state from redirect_uri (Google requires clean redirect_uri) + callbackUrlObj.searchParams.delete("state"); + const cleanRedirectUri = callbackUrlObj.toString(); + + // Store for later use in exchangeCode + lastRedirectUri = cleanRedirectUri; + + const url = new URL("https://accounts.google.com/o/oauth2/v2/auth"); + url.searchParams.set("redirect_uri", cleanRedirectUri); + url.searchParams.set("client_id", process.env.GOOGLE_CLIENT_ID!); + url.searchParams.set("response_type", "code"); + url.searchParams.set("scope", GOOGLE_ADS_SCOPES); + url.searchParams.set("access_type", "offline"); + url.searchParams.set("prompt", "consent"); + + // Pass state as a separate OAuth parameter (Google will return it in the callback) + if (state) { + url.searchParams.set("state", state); + } + + return url.toString(); + }, + + // Exchanges the authorization code for access token + exchangeCode: async ({ + code, + code_verifier, + code_challenge_method, + }: ExchangeCodeParams) => { + // Use the stored redirect_uri from authorizationUrl + const cleanRedirectUri = lastRedirectUri; + + if (!cleanRedirectUri) { + throw new Error( + "redirect_uri is required for Google OAuth token exchange", + ); + } + + const params = new URLSearchParams({ + code, + client_id: process.env.GOOGLE_CLIENT_ID!, + client_secret: process.env.GOOGLE_CLIENT_SECRET!, + grant_type: "authorization_code", + redirect_uri: cleanRedirectUri, + }); + + // Add PKCE verifier if provided + if (code_verifier) { + params.set("code_verifier", code_verifier); + } + if (code_challenge_method) { + params.set("code_challenge_method", code_challenge_method); + } + + const response = await fetch("https://oauth2.googleapis.com/token", { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: params, + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`Google OAuth failed: ${response.status} - ${error}`); + } + + const data = (await response.json()) as OAuthTokenResponse; + + return { + access_token: data.access_token, + refresh_token: data.refresh_token, + token_type: data.token_type || "Bearer", + expires_in: data.expires_in, + }; + }, + }, +}); + +serve(runtime.fetch); diff --git a/google-ads/server/tools/accounts.ts b/google-ads/server/tools/accounts.ts new file mode 100644 index 00000000..4dc53aad --- /dev/null +++ b/google-ads/server/tools/accounts.ts @@ -0,0 +1,121 @@ +/** + * Account Management Tools + * + * Tools for listing and getting Google Ads customer accounts + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; + +// ============================================================================ +// List Accessible Customers Tool +// ============================================================================ + +export const createListAccessibleCustomersTool = (env: Env) => + createPrivateTool({ + id: "list_accessible_customers", + description: + "List all Google Ads customer accounts accessible by the authenticated user. Returns customer resource names that can be used to get customer details.", + inputSchema: z.object({}), + outputSchema: z.object({ + customers: z.array( + z.object({ + resourceName: z + .string() + .describe("Customer resource name (e.g., 'customers/1234567890')"), + customerId: z.string().describe("Extracted customer ID"), + }), + ), + count: z.number().describe("Number of accessible customers"), + }), + execute: async () => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.listAccessibleCustomers(); + + const customers = (response.resourceNames || []).map((resourceName) => { + // Extract customer ID from resource name (e.g., 'customers/1234567890' -> '1234567890') + const customerId = resourceName.replace("customers/", ""); + return { + resourceName, + customerId, + }; + }); + + return { + customers, + count: customers.length, + }; + }, + }); + +// ============================================================================ +// Get Customer Tool +// ============================================================================ + +export const createGetCustomerTool = (env: Env) => + createPrivateTool({ + id: "get_customer", + description: + "Get detailed information about a specific Google Ads customer account including name, currency, timezone, and settings.", + inputSchema: z.object({ + customerId: z + .string() + .describe( + "Google Ads customer ID (e.g., '1234567890', without hyphens)", + ), + }), + outputSchema: z.object({ + customer: z + .object({ + resourceName: z.string(), + id: z.string(), + descriptiveName: z.string(), + currencyCode: z.string(), + timeZone: z.string(), + trackingUrlTemplate: z.string().optional(), + autoTaggingEnabled: z.boolean().optional(), + manager: z.boolean().optional(), + testAccount: z.boolean().optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const customer = await client.getCustomer(context.customerId); + + if (!customer) { + return { customer: null }; + } + + return { + customer: { + resourceName: customer.resourceName, + id: customer.id, + descriptiveName: customer.descriptiveName, + currencyCode: customer.currencyCode, + timeZone: customer.timeZone, + trackingUrlTemplate: customer.trackingUrlTemplate, + autoTaggingEnabled: customer.autoTaggingEnabled, + manager: customer.manager, + testAccount: customer.testAccount, + }, + }; + }, + }); + +// ============================================================================ +// Export all account tools +// ============================================================================ + +export const accountTools = [ + createListAccessibleCustomersTool, + createGetCustomerTool, +]; diff --git a/google-ads/server/tools/ad-groups.ts b/google-ads/server/tools/ad-groups.ts new file mode 100644 index 00000000..1577aaa3 --- /dev/null +++ b/google-ads/server/tools/ad-groups.ts @@ -0,0 +1,366 @@ +/** + * Ad Group Management Tools + * + * Tools for listing, creating, updating, and managing Google Ads ad groups + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import type { AdGroupStatus, AdGroupType } from "../lib/types.ts"; + +// ============================================================================ +// List Ad Groups Tool +// ============================================================================ + +export const createListAdGroupsTool = (env: Env) => + createPrivateTool({ + id: "list_ad_groups", + description: + "List ad groups for a Google Ads customer account. Can optionally filter by campaign.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignId: z + .string() + .optional() + .describe("Optional campaign ID to filter ad groups"), + }), + outputSchema: z.object({ + adGroups: z.array( + z.object({ + resourceName: z.string(), + id: z.string(), + name: z.string(), + campaign: z.string(), + status: z.string(), + type: z.string().optional(), + cpcBidMicros: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const adGroups = await client.listAdGroups( + context.customerId, + context.campaignId, + ); + + return { + adGroups: adGroups.map((adGroup) => ({ + resourceName: adGroup.resourceName, + id: adGroup.id, + name: adGroup.name, + campaign: adGroup.campaign, + status: adGroup.status, + type: adGroup.type, + cpcBidMicros: adGroup.cpcBidMicros, + })), + count: adGroups.length, + }; + }, + }); + +// ============================================================================ +// Get Ad Group Tool +// ============================================================================ + +export const createGetAdGroupTool = (env: Env) => + createPrivateTool({ + id: "get_ad_group", + description: + "Get detailed information about a specific Google Ads ad group.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z.string().describe("Ad group ID"), + }), + outputSchema: z.object({ + adGroup: z + .object({ + resourceName: z.string(), + id: z.string(), + name: z.string(), + campaign: z.string(), + status: z.string(), + type: z.string().optional(), + cpcBidMicros: z.string().optional(), + cpmBidMicros: z.string().optional(), + targetCpaMicros: z.string().optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const adGroup = await client.getAdGroup( + context.customerId, + context.adGroupId, + ); + + if (!adGroup) { + return { adGroup: null }; + } + + return { + adGroup: { + resourceName: adGroup.resourceName, + id: adGroup.id, + name: adGroup.name, + campaign: adGroup.campaign, + status: adGroup.status, + type: adGroup.type, + cpcBidMicros: adGroup.cpcBidMicros, + cpmBidMicros: adGroup.cpmBidMicros, + targetCpaMicros: adGroup.targetCpaMicros, + }, + }; + }, + }); + +// ============================================================================ +// Create Ad Group Tool +// ============================================================================ + +export const createCreateAdGroupTool = (env: Env) => + createPrivateTool({ + id: "create_ad_group", + description: + "Create a new ad group in a Google Ads campaign. Ad groups contain ads and keywords.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignResourceName: z + .string() + .describe( + "Campaign resource name (e.g., 'customers/123/campaigns/456')", + ), + name: z.string().describe("Ad group name"), + status: z + .enum(["ENABLED", "PAUSED"]) + .optional() + .default("PAUSED") + .describe("Initial ad group status (default: PAUSED)"), + type: z + .enum([ + "SEARCH_STANDARD", + "DISPLAY_STANDARD", + "SHOPPING_PRODUCT_ADS", + "VIDEO_TRUE_VIEW_IN_STREAM", + "VIDEO_BUMPER", + "VIDEO_RESPONSIVE", + ]) + .optional() + .describe("Ad group type (inferred from campaign if not specified)"), + cpcBidMicros: z + .string() + .optional() + .describe( + "Default CPC bid in micros (1 dollar = 1,000,000 micros). E.g., '1000000' for $1", + ), + cpmBidMicros: z + .string() + .optional() + .describe("Default CPM bid in micros (for display/video campaigns)"), + targetCpaMicros: z + .string() + .optional() + .describe("Target CPA in micros (for Target CPA bidding)"), + }), + outputSchema: z.object({ + resourceName: z.string().describe("Created ad group resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.createAdGroup(context.customerId, { + name: context.name, + campaign: context.campaignResourceName, + status: (context.status || "PAUSED") as AdGroupStatus, + type: context.type as AdGroupType | undefined, + cpcBidMicros: context.cpcBidMicros, + cpmBidMicros: context.cpmBidMicros, + targetCpaMicros: context.targetCpaMicros, + }); + + const resourceName = response.results[0]?.resourceName; + if (!resourceName) { + throw new Error("Failed to create ad group"); + } + + return { + resourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Update Ad Group Tool +// ============================================================================ + +export const createUpdateAdGroupTool = (env: Env) => + createPrivateTool({ + id: "update_ad_group", + description: + "Update an existing Google Ads ad group. Can change name, status, and bidding settings.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + name: z.string().optional().describe("New ad group name"), + status: z + .enum(["ENABLED", "PAUSED", "REMOVED"]) + .optional() + .describe("New ad group status"), + cpcBidMicros: z + .string() + .optional() + .describe("New default CPC bid in micros"), + cpmBidMicros: z + .string() + .optional() + .describe("New default CPM bid in micros"), + targetCpaMicros: z + .string() + .optional() + .describe("New target CPA in micros"), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.updateAdGroup(context.customerId, { + resourceName: context.adGroupResourceName, + name: context.name, + status: context.status as AdGroupStatus | undefined, + cpcBidMicros: context.cpcBidMicros, + cpmBidMicros: context.cpmBidMicros, + targetCpaMicros: context.targetCpaMicros, + }); + + return { + resourceName: + response.results[0]?.resourceName || context.adGroupResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Pause Ad Group Tool +// ============================================================================ + +export const createPauseAdGroupTool = (env: Env) => + createPrivateTool({ + id: "pause_ad_group", + description: + "Pause a Google Ads ad group. Sets the ad group status to PAUSED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + await client.updateAdGroupStatus( + context.customerId, + context.adGroupResourceName, + "PAUSED", + ); + + return { + resourceName: context.adGroupResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Enable Ad Group Tool +// ============================================================================ + +export const createEnableAdGroupTool = (env: Env) => + createPrivateTool({ + id: "enable_ad_group", + description: + "Enable a Google Ads ad group. Sets the ad group status to ENABLED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + await client.updateAdGroupStatus( + context.customerId, + context.adGroupResourceName, + "ENABLED", + ); + + return { + resourceName: context.adGroupResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Export all ad group tools +// ============================================================================ + +export const adGroupTools = [ + createListAdGroupsTool, + createGetAdGroupTool, + createCreateAdGroupTool, + createUpdateAdGroupTool, + createPauseAdGroupTool, + createEnableAdGroupTool, +]; diff --git a/google-ads/server/tools/ads.ts b/google-ads/server/tools/ads.ts new file mode 100644 index 00000000..c3219039 --- /dev/null +++ b/google-ads/server/tools/ads.ts @@ -0,0 +1,309 @@ +/** + * Ad Management Tools + * + * Tools for listing, creating, updating, and managing Google Ads ads + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import type { AdGroupAdStatus } from "../lib/types.ts"; + +// ============================================================================ +// List Ads Tool +// ============================================================================ + +export const createListAdsTool = (env: Env) => + createPrivateTool({ + id: "list_ads", + description: + "List ads for a Google Ads customer account. Can optionally filter by ad group.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z + .string() + .optional() + .describe("Optional ad group ID to filter ads"), + }), + outputSchema: z.object({ + ads: z.array( + z.object({ + resourceName: z.string(), + adId: z.string(), + adName: z.string().optional(), + adType: z.string(), + adGroup: z.string(), + status: z.string(), + finalUrls: z.array(z.string()).optional(), + approvalStatus: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const ads = await client.listAds(context.customerId, context.adGroupId); + + return { + ads: ads.map((adGroupAd) => ({ + resourceName: adGroupAd.resourceName, + adId: adGroupAd.ad.id, + adName: adGroupAd.ad.name, + adType: adGroupAd.ad.type, + adGroup: adGroupAd.adGroup, + status: adGroupAd.status, + finalUrls: adGroupAd.ad.finalUrls, + approvalStatus: adGroupAd.policySummary?.approvalStatus, + })), + count: ads.length, + }; + }, + }); + +// ============================================================================ +// Get Ad Tool +// ============================================================================ + +export const createGetAdTool = (env: Env) => + createPrivateTool({ + id: "get_ad", + description: + "Get detailed information about a specific Google Ads ad including creative content.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z.string().describe("Ad group ID"), + adId: z.string().describe("Ad ID"), + }), + outputSchema: z.object({ + ad: z + .object({ + resourceName: z.string(), + adId: z.string(), + adName: z.string().optional(), + adType: z.string(), + adGroup: z.string(), + status: z.string(), + finalUrls: z.array(z.string()).optional(), + displayUrl: z.string().optional(), + approvalStatus: z.string().optional(), + responsiveSearchAd: z + .object({ + headlines: z.array(z.object({ text: z.string() })), + descriptions: z.array(z.object({ text: z.string() })), + path1: z.string().optional(), + path2: z.string().optional(), + }) + .optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const adGroupAd = await client.getAd( + context.customerId, + context.adGroupId, + context.adId, + ); + + if (!adGroupAd) { + return { ad: null }; + } + + return { + ad: { + resourceName: adGroupAd.resourceName, + adId: adGroupAd.ad.id, + adName: adGroupAd.ad.name, + adType: adGroupAd.ad.type, + adGroup: adGroupAd.adGroup, + status: adGroupAd.status, + finalUrls: adGroupAd.ad.finalUrls, + displayUrl: adGroupAd.ad.displayUrl, + approvalStatus: adGroupAd.policySummary?.approvalStatus, + responsiveSearchAd: adGroupAd.ad.responsiveSearchAd, + }, + }; + }, + }); + +// ============================================================================ +// Create Responsive Search Ad Tool +// ============================================================================ + +export const createCreateResponsiveSearchAdTool = (env: Env) => + createPrivateTool({ + id: "create_responsive_search_ad", + description: + "Create a new Responsive Search Ad (RSA) in a Google Ads ad group. RSAs automatically test different headline and description combinations.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + finalUrls: z + .array(z.string()) + .describe("Landing page URLs (usually just one URL)"), + headlines: z + .array(z.string()) + .min(3) + .max(15) + .describe("Ad headlines (3-15 headlines, each max 30 characters)"), + descriptions: z + .array(z.string()) + .min(2) + .max(4) + .describe("Ad descriptions (2-4 descriptions, each max 90 characters)"), + path1: z + .string() + .optional() + .describe("Display URL path 1 (max 15 characters)"), + path2: z + .string() + .optional() + .describe("Display URL path 2 (max 15 characters, requires path1)"), + status: z + .enum(["ENABLED", "PAUSED"]) + .optional() + .default("PAUSED") + .describe("Initial ad status (default: PAUSED)"), + }), + outputSchema: z.object({ + resourceName: z.string().describe("Created ad resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.createResponsiveSearchAd( + context.customerId, + { + adGroup: context.adGroupResourceName, + status: (context.status || "PAUSED") as AdGroupAdStatus, + finalUrls: context.finalUrls, + headlines: context.headlines.map((text) => ({ text })), + descriptions: context.descriptions.map((text) => ({ text })), + path1: context.path1, + path2: context.path2, + }, + ); + + const resourceName = response.results[0]?.resourceName; + if (!resourceName) { + throw new Error("Failed to create ad"); + } + + return { + resourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Pause Ad Tool +// ============================================================================ + +export const createPauseAdTool = (env: Env) => + createPrivateTool({ + id: "pause_ad", + description: "Pause a Google Ads ad. Sets the ad status to PAUSED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adResourceName: z + .string() + .describe( + "Ad resource name (e.g., 'customers/123/adGroupAds/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + await client.updateAdStatus( + context.customerId, + context.adResourceName, + "PAUSED", + ); + + return { + resourceName: context.adResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Enable Ad Tool +// ============================================================================ + +export const createEnableAdTool = (env: Env) => + createPrivateTool({ + id: "enable_ad", + description: "Enable a Google Ads ad. Sets the ad status to ENABLED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adResourceName: z + .string() + .describe( + "Ad resource name (e.g., 'customers/123/adGroupAds/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + await client.updateAdStatus( + context.customerId, + context.adResourceName, + "ENABLED", + ); + + return { + resourceName: context.adResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Export all ad tools +// ============================================================================ + +export const adTools = [ + createListAdsTool, + createGetAdTool, + createCreateResponsiveSearchAdTool, + createPauseAdTool, + createEnableAdTool, +]; diff --git a/google-ads/server/tools/campaigns.ts b/google-ads/server/tools/campaigns.ts new file mode 100644 index 00000000..96fff18b --- /dev/null +++ b/google-ads/server/tools/campaigns.ts @@ -0,0 +1,456 @@ +/** + * Campaign Management Tools + * + * Tools for listing, creating, updating, and managing Google Ads campaigns + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import type { CampaignStatus, AdvertisingChannelType } from "../lib/types.ts"; + +// ============================================================================ +// List Campaigns Tool +// ============================================================================ + +export const createListCampaignsTool = (env: Env) => + createPrivateTool({ + id: "list_campaigns", + description: + "List all campaigns for a Google Ads customer account. Can optionally filter by status.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + statusFilter: z + .enum(["ENABLED", "PAUSED", "REMOVED"]) + .optional() + .describe("Filter campaigns by status"), + }), + outputSchema: z.object({ + campaigns: z.array( + z.object({ + resourceName: z.string(), + id: z.string(), + name: z.string(), + status: z.string(), + advertisingChannelType: z.string(), + advertisingChannelSubType: z.string().optional(), + biddingStrategyType: z.string().optional(), + startDate: z.string().optional(), + endDate: z.string().optional(), + servingStatus: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const campaigns = await client.listCampaigns( + context.customerId, + context.statusFilter as CampaignStatus | undefined, + ); + + return { + campaigns: campaigns.map((campaign) => ({ + resourceName: campaign.resourceName, + id: campaign.id, + name: campaign.name, + status: campaign.status, + advertisingChannelType: campaign.advertisingChannelType, + advertisingChannelSubType: campaign.advertisingChannelSubType, + biddingStrategyType: campaign.biddingStrategyType, + startDate: campaign.startDate, + endDate: campaign.endDate, + servingStatus: campaign.servingStatus, + })), + count: campaigns.length, + }; + }, + }); + +// ============================================================================ +// Get Campaign Tool +// ============================================================================ + +export const createGetCampaignTool = (env: Env) => + createPrivateTool({ + id: "get_campaign", + description: + "Get detailed information about a specific Google Ads campaign including settings and configuration.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignId: z.string().describe("Campaign ID"), + }), + outputSchema: z.object({ + campaign: z + .object({ + resourceName: z.string(), + id: z.string(), + name: z.string(), + status: z.string(), + advertisingChannelType: z.string(), + advertisingChannelSubType: z.string().optional(), + biddingStrategyType: z.string().optional(), + startDate: z.string().optional(), + endDate: z.string().optional(), + campaignBudget: z.string().optional(), + servingStatus: z.string().optional(), + networkSettings: z + .object({ + targetGoogleSearch: z.boolean().optional(), + targetSearchNetwork: z.boolean().optional(), + targetContentNetwork: z.boolean().optional(), + }) + .optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const campaign = await client.getCampaign( + context.customerId, + context.campaignId, + ); + + if (!campaign) { + return { campaign: null }; + } + + return { + campaign: { + resourceName: campaign.resourceName, + id: campaign.id, + name: campaign.name, + status: campaign.status, + advertisingChannelType: campaign.advertisingChannelType, + advertisingChannelSubType: campaign.advertisingChannelSubType, + biddingStrategyType: campaign.biddingStrategyType, + startDate: campaign.startDate, + endDate: campaign.endDate, + campaignBudget: campaign.campaignBudget, + servingStatus: campaign.servingStatus, + networkSettings: campaign.networkSettings, + }, + }; + }, + }); + +// ============================================================================ +// Create Campaign Tool +// ============================================================================ + +export const createCreateCampaignTool = (env: Env) => + createPrivateTool({ + id: "create_campaign", + description: + "Create a new Google Ads campaign. First create a campaign budget, then create the campaign with the budget resource name.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + name: z.string().describe("Campaign name"), + advertisingChannelType: z + .enum([ + "SEARCH", + "DISPLAY", + "SHOPPING", + "VIDEO", + "PERFORMANCE_MAX", + "DEMAND_GEN", + "LOCAL", + "SMART", + "HOTEL", + "LOCAL_SERVICES", + "TRAVEL", + "DISCOVERY", + ]) + .describe("Campaign type (e.g., SEARCH, DISPLAY, VIDEO)"), + budgetAmountMicros: z + .string() + .describe( + "Daily budget amount in micros (1 dollar = 1,000,000 micros). E.g., '10000000' for $10", + ), + budgetName: z + .string() + .optional() + .describe("Budget name (defaults to campaign name + ' Budget')"), + status: z + .enum(["ENABLED", "PAUSED"]) + .optional() + .default("PAUSED") + .describe("Initial campaign status (default: PAUSED)"), + startDate: z + .string() + .optional() + .describe("Campaign start date (YYYY-MM-DD format)"), + endDate: z + .string() + .optional() + .describe("Campaign end date (YYYY-MM-DD format)"), + targetGoogleSearch: z + .boolean() + .optional() + .describe("Target Google Search (for SEARCH campaigns)"), + targetSearchNetwork: z + .boolean() + .optional() + .describe("Target Search Network partners"), + targetContentNetwork: z + .boolean() + .optional() + .describe("Target Display Network"), + manualCpcEnabled: z + .boolean() + .optional() + .describe("Use Manual CPC bidding strategy"), + enhancedCpcEnabled: z + .boolean() + .optional() + .describe("Enable Enhanced CPC (only with Manual CPC)"), + }), + outputSchema: z.object({ + campaignResourceName: z + .string() + .describe("Created campaign resource name"), + budgetResourceName: z.string().describe("Created budget resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + // First, create the campaign budget + const budgetResponse = await client.createCampaignBudget( + context.customerId, + { + name: context.budgetName || `${context.name} Budget`, + amountMicros: context.budgetAmountMicros, + deliveryMethod: "STANDARD", + }, + ); + + const budgetResourceName = budgetResponse.results[0]?.resourceName; + if (!budgetResourceName) { + throw new Error("Failed to create campaign budget"); + } + + // Build network settings if any are specified + const networkSettings = + context.targetGoogleSearch !== undefined || + context.targetSearchNetwork !== undefined || + context.targetContentNetwork !== undefined + ? { + targetGoogleSearch: context.targetGoogleSearch, + targetSearchNetwork: context.targetSearchNetwork, + targetContentNetwork: context.targetContentNetwork, + } + : undefined; + + // Build manual CPC settings if specified + const manualCpc = context.manualCpcEnabled + ? { enhancedCpcEnabled: context.enhancedCpcEnabled } + : undefined; + + // Then, create the campaign + const campaignResponse = await client.createCampaign(context.customerId, { + name: context.name, + advertisingChannelType: + context.advertisingChannelType as AdvertisingChannelType, + status: (context.status || "PAUSED") as CampaignStatus, + campaignBudget: budgetResourceName, + startDate: context.startDate, + endDate: context.endDate, + networkSettings, + manualCpc, + }); + + const campaignResourceName = campaignResponse.results[0]?.resourceName; + if (!campaignResourceName) { + throw new Error("Failed to create campaign"); + } + + return { + campaignResourceName, + budgetResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Update Campaign Tool +// ============================================================================ + +export const createUpdateCampaignTool = (env: Env) => + createPrivateTool({ + id: "update_campaign", + description: + "Update an existing Google Ads campaign. Can change name, status, dates, and network settings.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignResourceName: z + .string() + .describe( + "Campaign resource name (e.g., 'customers/123/campaigns/456')", + ), + name: z.string().optional().describe("New campaign name"), + status: z + .enum(["ENABLED", "PAUSED", "REMOVED"]) + .optional() + .describe("New campaign status"), + startDate: z + .string() + .optional() + .describe("New start date (YYYY-MM-DD format)"), + endDate: z + .string() + .optional() + .describe("New end date (YYYY-MM-DD format)"), + targetGoogleSearch: z.boolean().optional(), + targetSearchNetwork: z.boolean().optional(), + targetContentNetwork: z.boolean().optional(), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const networkSettings = + context.targetGoogleSearch !== undefined || + context.targetSearchNetwork !== undefined || + context.targetContentNetwork !== undefined + ? { + targetGoogleSearch: context.targetGoogleSearch, + targetSearchNetwork: context.targetSearchNetwork, + targetContentNetwork: context.targetContentNetwork, + } + : undefined; + + const response = await client.updateCampaign(context.customerId, { + resourceName: context.campaignResourceName, + name: context.name, + status: context.status as CampaignStatus | undefined, + startDate: context.startDate, + endDate: context.endDate, + networkSettings, + }); + + return { + resourceName: + response.results[0]?.resourceName || context.campaignResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Pause Campaign Tool +// ============================================================================ + +export const createPauseCampaignTool = (env: Env) => + createPrivateTool({ + id: "pause_campaign", + description: + "Pause a Google Ads campaign. Sets the campaign status to PAUSED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignResourceName: z + .string() + .describe( + "Campaign resource name (e.g., 'customers/123/campaigns/456')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + await client.updateCampaignStatus( + context.customerId, + context.campaignResourceName, + "PAUSED", + ); + + return { + resourceName: context.campaignResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Enable Campaign Tool +// ============================================================================ + +export const createEnableCampaignTool = (env: Env) => + createPrivateTool({ + id: "enable_campaign", + description: + "Enable a Google Ads campaign. Sets the campaign status to ENABLED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignResourceName: z + .string() + .describe( + "Campaign resource name (e.g., 'customers/123/campaigns/456')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + await client.updateCampaignStatus( + context.customerId, + context.campaignResourceName, + "ENABLED", + ); + + return { + resourceName: context.campaignResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Export all campaign tools +// ============================================================================ + +export const campaignTools = [ + createListCampaignsTool, + createGetCampaignTool, + createCreateCampaignTool, + createUpdateCampaignTool, + createPauseCampaignTool, + createEnableCampaignTool, +]; diff --git a/google-ads/server/tools/index.ts b/google-ads/server/tools/index.ts new file mode 100644 index 00000000..897c81ae --- /dev/null +++ b/google-ads/server/tools/index.ts @@ -0,0 +1,37 @@ +/** + * Central export point for all Google Ads tools + * + * This file aggregates all tools from different modules into a single + * export, making it easy to import all tools in main.ts. + * + * Tools: + * - accountTools: Account management (list accessible customers, get customer) + * - campaignTools: Campaign management (list, get, create, update, pause, enable) + * - adGroupTools: Ad group management (list, get, create, update, pause, enable) + * - adTools: Ad management (list, get, create responsive search ad, pause, enable) + * - keywordTools: Keyword management (list, get, create, create negative, update, pause, enable, remove) + * - reportTools: Performance reports (account, campaign, ad group, keyword) + */ + +import { accountTools } from "./accounts.ts"; +import { campaignTools } from "./campaigns.ts"; +import { adGroupTools } from "./ad-groups.ts"; +import { adTools } from "./ads.ts"; +import { keywordTools } from "./keywords.ts"; +import { reportTools } from "./reports.ts"; + +// Export all tools from all modules +export const tools = [ + // Account management tools + ...accountTools, + // Campaign management tools + ...campaignTools, + // Ad group management tools + ...adGroupTools, + // Ad management tools + ...adTools, + // Keyword management tools + ...keywordTools, + // Report tools + ...reportTools, +]; diff --git a/google-ads/server/tools/keywords.ts b/google-ads/server/tools/keywords.ts new file mode 100644 index 00000000..355d4b9b --- /dev/null +++ b/google-ads/server/tools/keywords.ts @@ -0,0 +1,466 @@ +/** + * Keyword Management Tools + * + * Tools for listing, creating, updating, and managing Google Ads keywords + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import type { KeywordMatchType, AdGroupCriterionStatus } from "../lib/types.ts"; + +// ============================================================================ +// List Keywords Tool +// ============================================================================ + +export const createListKeywordsTool = (env: Env) => + createPrivateTool({ + id: "list_keywords", + description: + "List keywords for a Google Ads customer account. Can optionally filter by ad group.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z + .string() + .optional() + .describe("Optional ad group ID to filter keywords"), + }), + outputSchema: z.object({ + keywords: z.array( + z.object({ + resourceName: z.string(), + criterionId: z.string(), + adGroup: z.string(), + text: z.string(), + matchType: z.string(), + status: z.string(), + cpcBidMicros: z.string().optional(), + negative: z.boolean().optional(), + qualityScore: z.number().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const keywords = await client.listKeywords( + context.customerId, + context.adGroupId, + ); + + return { + keywords: keywords.map((keyword) => ({ + resourceName: keyword.resourceName, + criterionId: keyword.criterionId, + adGroup: keyword.adGroup, + text: keyword.keyword?.text || "", + matchType: keyword.keyword?.matchType || "UNKNOWN", + status: keyword.status, + cpcBidMicros: keyword.cpcBidMicros, + negative: keyword.negative, + qualityScore: keyword.qualityInfo?.qualityScore, + })), + count: keywords.length, + }; + }, + }); + +// ============================================================================ +// Get Keyword Tool +// ============================================================================ + +export const createGetKeywordTool = (env: Env) => + createPrivateTool({ + id: "get_keyword", + description: + "Get detailed information about a specific Google Ads keyword including quality score and bid estimates.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z.string().describe("Ad group ID"), + criterionId: z.string().describe("Keyword criterion ID"), + }), + outputSchema: z.object({ + keyword: z + .object({ + resourceName: z.string(), + criterionId: z.string(), + adGroup: z.string(), + text: z.string(), + matchType: z.string(), + status: z.string(), + cpcBidMicros: z.string().optional(), + negative: z.boolean().optional(), + qualityScore: z.number().optional(), + firstPageCpcMicros: z.string().optional(), + topOfPageCpcMicros: z.string().optional(), + }) + .nullable(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const keyword = await client.getKeyword( + context.customerId, + context.adGroupId, + context.criterionId, + ); + + if (!keyword) { + return { keyword: null }; + } + + return { + keyword: { + resourceName: keyword.resourceName, + criterionId: keyword.criterionId, + adGroup: keyword.adGroup, + text: keyword.keyword?.text || "", + matchType: keyword.keyword?.matchType || "UNKNOWN", + status: keyword.status, + cpcBidMicros: keyword.cpcBidMicros, + negative: keyword.negative, + qualityScore: keyword.qualityInfo?.qualityScore, + firstPageCpcMicros: keyword.positionEstimates?.firstPageCpcMicros, + topOfPageCpcMicros: keyword.positionEstimates?.topOfPageCpcMicros, + }, + }; + }, + }); + +// ============================================================================ +// Create Keyword Tool +// ============================================================================ + +export const createCreateKeywordTool = (env: Env) => + createPrivateTool({ + id: "create_keyword", + description: + "Add a new keyword to a Google Ads ad group. Keywords trigger your ads to show when users search for related terms.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + text: z.string().describe("Keyword text (e.g., 'running shoes')"), + matchType: z + .enum(["EXACT", "PHRASE", "BROAD"]) + .describe( + "Match type: EXACT (most specific), PHRASE (moderate), BROAD (widest reach)", + ), + cpcBidMicros: z + .string() + .optional() + .describe( + "Max CPC bid in micros (1 dollar = 1,000,000 micros). E.g., '500000' for $0.50", + ), + finalUrls: z + .array(z.string()) + .optional() + .describe("Optional landing page URLs specific to this keyword"), + negative: z + .boolean() + .optional() + .describe( + "Set to true to create a negative keyword (blocks ads from showing)", + ), + status: z + .enum(["ENABLED", "PAUSED"]) + .optional() + .default("ENABLED") + .describe("Initial keyword status (default: ENABLED)"), + }), + outputSchema: z.object({ + resourceName: z.string().describe("Created keyword resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.createKeyword(context.customerId, { + adGroup: context.adGroupResourceName, + status: (context.status || "ENABLED") as AdGroupCriterionStatus, + keyword: { + text: context.text, + matchType: context.matchType as KeywordMatchType, + }, + cpcBidMicros: context.cpcBidMicros, + finalUrls: context.finalUrls, + negative: context.negative, + }); + + const resourceName = response.results[0]?.resourceName; + if (!resourceName) { + throw new Error("Failed to create keyword"); + } + + return { + resourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Create Negative Keyword Tool +// ============================================================================ + +export const createCreateNegativeKeywordTool = (env: Env) => + createPrivateTool({ + id: "create_negative_keyword", + description: + "Add a negative keyword to a Google Ads ad group. Negative keywords prevent your ads from showing for certain searches.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupResourceName: z + .string() + .describe( + "Ad group resource name (e.g., 'customers/123/adGroups/456')", + ), + text: z + .string() + .describe( + "Negative keyword text (e.g., 'free' to block searches containing 'free')", + ), + matchType: z + .enum(["EXACT", "PHRASE", "BROAD"]) + .describe("Match type for the negative keyword"), + }), + outputSchema: z.object({ + resourceName: z + .string() + .describe("Created negative keyword resource name"), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.createKeyword(context.customerId, { + adGroup: context.adGroupResourceName, + status: "ENABLED", + keyword: { + text: context.text, + matchType: context.matchType as KeywordMatchType, + }, + negative: true, + }); + + const resourceName = response.results[0]?.resourceName; + if (!resourceName) { + throw new Error("Failed to create negative keyword"); + } + + return { + resourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Update Keyword Tool +// ============================================================================ + +export const createUpdateKeywordTool = (env: Env) => + createPrivateTool({ + id: "update_keyword", + description: + "Update an existing Google Ads keyword. Can change status, bid, or landing page URLs.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + keywordResourceName: z + .string() + .describe( + "Keyword resource name (e.g., 'customers/123/adGroupCriteria/456~789')", + ), + status: z + .enum(["ENABLED", "PAUSED", "REMOVED"]) + .optional() + .describe("New keyword status"), + cpcBidMicros: z.string().optional().describe("New max CPC bid in micros"), + finalUrls: z + .array(z.string()) + .optional() + .describe("New landing page URLs"), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.updateKeyword(context.customerId, { + resourceName: context.keywordResourceName, + status: context.status as AdGroupCriterionStatus | undefined, + cpcBidMicros: context.cpcBidMicros, + finalUrls: context.finalUrls, + }); + + return { + resourceName: + response.results[0]?.resourceName || context.keywordResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Pause Keyword Tool +// ============================================================================ + +export const createPauseKeywordTool = (env: Env) => + createPrivateTool({ + id: "pause_keyword", + description: + "Pause a Google Ads keyword. Sets the keyword status to PAUSED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + keywordResourceName: z + .string() + .describe( + "Keyword resource name (e.g., 'customers/123/adGroupCriteria/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + await client.updateKeywordStatus( + context.customerId, + context.keywordResourceName, + "PAUSED", + ); + + return { + resourceName: context.keywordResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Enable Keyword Tool +// ============================================================================ + +export const createEnableKeywordTool = (env: Env) => + createPrivateTool({ + id: "enable_keyword", + description: + "Enable a Google Ads keyword. Sets the keyword status to ENABLED.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + keywordResourceName: z + .string() + .describe( + "Keyword resource name (e.g., 'customers/123/adGroupCriteria/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + await client.updateKeywordStatus( + context.customerId, + context.keywordResourceName, + "ENABLED", + ); + + return { + resourceName: context.keywordResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Remove Keyword Tool +// ============================================================================ + +export const createRemoveKeywordTool = (env: Env) => + createPrivateTool({ + id: "remove_keyword", + description: + "Remove a Google Ads keyword. This permanently deletes the keyword from the ad group.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + keywordResourceName: z + .string() + .describe( + "Keyword resource name (e.g., 'customers/123/adGroupCriteria/456~789')", + ), + }), + outputSchema: z.object({ + resourceName: z.string(), + success: z.boolean(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + await client.removeKeyword( + context.customerId, + context.keywordResourceName, + ); + + return { + resourceName: context.keywordResourceName, + success: true, + }; + }, + }); + +// ============================================================================ +// Export all keyword tools +// ============================================================================ + +export const keywordTools = [ + createListKeywordsTool, + createGetKeywordTool, + createCreateKeywordTool, + createCreateNegativeKeywordTool, + createUpdateKeywordTool, + createPauseKeywordTool, + createEnableKeywordTool, + createRemoveKeywordTool, +]; diff --git a/google-ads/server/tools/reports.ts b/google-ads/server/tools/reports.ts new file mode 100644 index 00000000..7b963c6f --- /dev/null +++ b/google-ads/server/tools/reports.ts @@ -0,0 +1,378 @@ +/** + * Reporting Tools + * + * Tools for getting Google Ads performance reports and metrics + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import { DATE_RANGE_PRESETS } from "../constants.ts"; + +// Helper to convert micros to currency string +const microsToAmount = (micros: string | undefined): string | undefined => { + if (!micros) return undefined; + const amount = parseInt(micros, 10) / 1_000_000; + return amount.toFixed(2); +}; + +// ============================================================================ +// Get Account Performance Tool +// ============================================================================ + +export const createGetAccountPerformanceTool = (env: Env) => + createPrivateTool({ + id: "get_account_performance", + description: + "Get overall account performance metrics for a Google Ads customer account over a specified date range.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + dateRange: z + .enum([ + "TODAY", + "YESTERDAY", + "LAST_7_DAYS", + "LAST_14_DAYS", + "LAST_30_DAYS", + "LAST_90_DAYS", + "THIS_WEEK_SUN_TODAY", + "THIS_WEEK_MON_TODAY", + "LAST_WEEK_SUN_SAT", + "LAST_WEEK_MON_SUN", + "THIS_MONTH", + "LAST_MONTH", + "ALL_TIME", + ]) + .default("LAST_30_DAYS") + .describe("Date range for the report (default: LAST_30_DAYS)"), + }), + outputSchema: z.object({ + accountId: z.string(), + accountName: z.string().optional(), + dateRange: z.string(), + metrics: z.object({ + impressions: z.string().optional(), + clicks: z.string().optional(), + cost: z.string().optional().describe("Cost in account currency"), + conversions: z.number().optional(), + conversionsValue: z.number().optional(), + ctr: z.number().optional().describe("Click-through rate (percentage)"), + averageCpc: z.string().optional().describe("Average cost per click"), + averageCpm: z + .string() + .optional() + .describe("Average cost per 1000 impressions"), + }), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const rows = await client.getAccountPerformance( + context.customerId, + context.dateRange, + ); + + const row = rows[0]; + if (!row) { + return { + accountId: context.customerId, + dateRange: context.dateRange, + metrics: {}, + }; + } + + return { + accountId: row.customer?.id || context.customerId, + accountName: row.customer?.descriptiveName, + dateRange: context.dateRange, + metrics: { + impressions: row.metrics?.impressions, + clicks: row.metrics?.clicks, + cost: microsToAmount(row.metrics?.costMicros), + conversions: row.metrics?.conversions, + conversionsValue: row.metrics?.conversionsValue, + ctr: row.metrics?.ctr, + averageCpc: microsToAmount(row.metrics?.averageCpc?.toString()), + averageCpm: microsToAmount(row.metrics?.averageCpm?.toString()), + }, + }; + }, + }); + +// ============================================================================ +// Get Campaign Performance Tool +// ============================================================================ + +export const createGetCampaignPerformanceTool = (env: Env) => + createPrivateTool({ + id: "get_campaign_performance", + description: + "Get campaign performance metrics for all campaigns or a specific campaign over a date range. Shows daily breakdown.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignId: z + .string() + .optional() + .describe("Optional campaign ID to filter results"), + dateRange: z + .enum([ + "TODAY", + "YESTERDAY", + "LAST_7_DAYS", + "LAST_14_DAYS", + "LAST_30_DAYS", + "LAST_90_DAYS", + "THIS_WEEK_SUN_TODAY", + "THIS_WEEK_MON_TODAY", + "LAST_WEEK_SUN_SAT", + "LAST_WEEK_MON_SUN", + "THIS_MONTH", + "LAST_MONTH", + "ALL_TIME", + ]) + .default("LAST_30_DAYS") + .describe("Date range for the report (default: LAST_30_DAYS)"), + }), + outputSchema: z.object({ + dateRange: z.string(), + data: z.array( + z.object({ + date: z.string().optional(), + campaignId: z.string(), + campaignName: z.string(), + status: z.string(), + impressions: z.string().optional(), + clicks: z.string().optional(), + cost: z.string().optional(), + conversions: z.number().optional(), + conversionsValue: z.number().optional(), + ctr: z.number().optional(), + averageCpc: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const rows = await client.getCampaignPerformance( + context.customerId, + context.dateRange, + context.campaignId, + ); + + return { + dateRange: context.dateRange, + data: rows.map((row) => ({ + date: row.segments?.date, + campaignId: row.campaign?.id || "", + campaignName: row.campaign?.name || "", + status: row.campaign?.status || "", + impressions: row.metrics?.impressions, + clicks: row.metrics?.clicks, + cost: microsToAmount(row.metrics?.costMicros), + conversions: row.metrics?.conversions, + conversionsValue: row.metrics?.conversionsValue, + ctr: row.metrics?.ctr, + averageCpc: microsToAmount(row.metrics?.averageCpc?.toString()), + })), + count: rows.length, + }; + }, + }); + +// ============================================================================ +// Get Ad Group Performance Tool +// ============================================================================ + +export const createGetAdGroupPerformanceTool = (env: Env) => + createPrivateTool({ + id: "get_ad_group_performance", + description: + "Get ad group performance metrics over a date range. Can filter by campaign.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + campaignId: z + .string() + .optional() + .describe("Optional campaign ID to filter results"), + dateRange: z + .enum([ + "TODAY", + "YESTERDAY", + "LAST_7_DAYS", + "LAST_14_DAYS", + "LAST_30_DAYS", + "LAST_90_DAYS", + "THIS_WEEK_SUN_TODAY", + "THIS_WEEK_MON_TODAY", + "LAST_WEEK_SUN_SAT", + "LAST_WEEK_MON_SUN", + "THIS_MONTH", + "LAST_MONTH", + "ALL_TIME", + ]) + .default("LAST_30_DAYS") + .describe("Date range for the report (default: LAST_30_DAYS)"), + }), + outputSchema: z.object({ + dateRange: z.string(), + data: z.array( + z.object({ + date: z.string().optional(), + adGroupId: z.string(), + adGroupName: z.string(), + campaign: z.string().optional(), + status: z.string(), + impressions: z.string().optional(), + clicks: z.string().optional(), + cost: z.string().optional(), + conversions: z.number().optional(), + ctr: z.number().optional(), + averageCpc: z.string().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const rows = await client.getAdGroupPerformance( + context.customerId, + context.dateRange, + context.campaignId, + ); + + return { + dateRange: context.dateRange, + data: rows.map((row) => ({ + date: row.segments?.date, + adGroupId: row.adGroup?.id || "", + adGroupName: row.adGroup?.name || "", + campaign: row.adGroup?.campaign, + status: row.adGroup?.status || "", + impressions: row.metrics?.impressions, + clicks: row.metrics?.clicks, + cost: microsToAmount(row.metrics?.costMicros), + conversions: row.metrics?.conversions, + ctr: row.metrics?.ctr, + averageCpc: microsToAmount(row.metrics?.averageCpc?.toString()), + })), + count: rows.length, + }; + }, + }); + +// ============================================================================ +// Get Keyword Performance Tool +// ============================================================================ + +export const createGetKeywordPerformanceTool = (env: Env) => + createPrivateTool({ + id: "get_keyword_performance", + description: + "Get keyword performance metrics over a date range. Shows which keywords are performing best.", + inputSchema: z.object({ + customerId: z + .string() + .describe("Google Ads customer ID (e.g., '1234567890')"), + adGroupId: z + .string() + .optional() + .describe("Optional ad group ID to filter results"), + dateRange: z + .enum([ + "TODAY", + "YESTERDAY", + "LAST_7_DAYS", + "LAST_14_DAYS", + "LAST_30_DAYS", + "LAST_90_DAYS", + "THIS_WEEK_SUN_TODAY", + "THIS_WEEK_MON_TODAY", + "LAST_WEEK_SUN_SAT", + "LAST_WEEK_MON_SUN", + "THIS_MONTH", + "LAST_MONTH", + "ALL_TIME", + ]) + .default("LAST_30_DAYS") + .describe("Date range for the report (default: LAST_30_DAYS)"), + }), + outputSchema: z.object({ + dateRange: z.string(), + data: z.array( + z.object({ + date: z.string().optional(), + criterionId: z.string(), + keywordText: z.string(), + matchType: z.string(), + adGroupName: z.string().optional(), + status: z.string(), + impressions: z.string().optional(), + clicks: z.string().optional(), + cost: z.string().optional(), + conversions: z.number().optional(), + ctr: z.number().optional(), + averageCpc: z.string().optional(), + qualityScore: z.number().optional(), + }), + ), + count: z.number(), + }), + execute: async ({ context }) => { + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + }); + + const rows = await client.getKeywordPerformance( + context.customerId, + context.dateRange, + context.adGroupId, + ); + + return { + dateRange: context.dateRange, + data: rows.map((row) => ({ + date: row.segments?.date, + criterionId: row.adGroupCriterion?.criterionId || "", + keywordText: row.adGroupCriterion?.keyword?.text || "", + matchType: row.adGroupCriterion?.keyword?.matchType || "", + adGroupName: row.adGroup?.name, + status: row.adGroupCriterion?.status || "", + impressions: row.metrics?.impressions, + clicks: row.metrics?.clicks, + cost: microsToAmount(row.metrics?.costMicros), + conversions: row.metrics?.conversions, + ctr: row.metrics?.ctr, + averageCpc: microsToAmount(row.metrics?.averageCpc?.toString()), + qualityScore: row.adGroupCriterion?.qualityInfo?.qualityScore, + })), + count: rows.length, + }; + }, + }); + +// ============================================================================ +// Export all report tools +// ============================================================================ + +export const reportTools = [ + createGetAccountPerformanceTool, + createGetCampaignPerformanceTool, + createGetAdGroupPerformanceTool, + createGetKeywordPerformanceTool, +]; diff --git a/google-ads/shared/deco.gen.ts b/google-ads/shared/deco.gen.ts new file mode 100644 index 00000000..95c291bb --- /dev/null +++ b/google-ads/shared/deco.gen.ts @@ -0,0 +1,68 @@ +// Generated types for Google Ads MCP + +import { z } from "zod"; + +/** + * Mesh request context injected by the Deco runtime + * Contains authentication and metadata for the current request + */ +export interface MeshRequestContext { + /** OAuth access token from Google */ + authorization?: string; + /** Internal state for OAuth flow */ + state?: string; + /** JWT token for the request */ + token?: string; + /** URL of the mesh server */ + meshUrl?: string; + /** Connection ID for this session */ + connectionId?: string; + /** Function to ensure user is authenticated */ + ensureAuthenticated?: () => Promise; +} + +/** + * Environment type for Google Ads MCP + * Extends process env with Deco runtime context + */ +export interface Env { + /** Google OAuth Client ID */ + GOOGLE_CLIENT_ID: string; + /** Google OAuth Client Secret */ + GOOGLE_CLIENT_SECRET: string; + /** Mesh request context injected by runtime */ + MESH_REQUEST_CONTEXT: MeshRequestContext; + /** Self-reference MCP (if needed) */ + SELF?: Record; + /** Whether running locally */ + IS_LOCAL?: boolean; +} + +/** + * State schema for OAuth flow validation + */ +export const StateSchema = z.object({}); + +/** + * MCP type helper for typed tool definitions + */ +export type Mcp< + T extends Record< + string, + (input: Record) => Promise> + >, +> = { + [K in keyof T]: (( + input: Parameters[0], + ) => Promise>>) & { + asTool: () => Promise<{ + inputSchema: z.ZodType[0]>; + outputSchema?: z.ZodType>>; + description: string; + id: string; + execute: ( + input: Parameters[0], + ) => Promise>>; + }>; + }; +}; diff --git a/google-ads/tsconfig.json b/google-ads/tsconfig.json new file mode 100644 index 00000000..cdb2eab2 --- /dev/null +++ b/google-ads/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ES2022"], + "strict": true, + "noEmit": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "allowImportingTsExtensions": true, + "types": ["node"], + "paths": { + "@decocms/mcps-shared/*": ["../shared/*"] + } + }, + "include": ["server/**/*.ts", "shared/**/*.ts"], + "exclude": ["node_modules", "dist"] +} + From 8a470ef36f8f6d6ed5e09b391443e5e6fe551861 Mon Sep 17 00:00:00 2001 From: Marcos Candeia Date: Thu, 8 Jan 2026 18:15:29 -0300 Subject: [PATCH 02/31] Bump runtime version Signed-off-by: Marcos Candeia --- bun.lock | 307 ++++++++++++++------------------ content-scraper/package.json | 2 +- google-calendar/package.json | 2 +- google-tag-manager/package.json | 2 +- mcp-studio/package.json | 2 +- meta-ads/package.json | 2 +- openrouter/package.json | 4 +- registry/package.json | 2 +- shared/package.json | 2 +- 9 files changed, 144 insertions(+), 181 deletions(-) diff --git a/bun.lock b/bun.lock index 44a6b814..eb060969 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 1, "workspaces": { "": { "name": "@decocms/mcps", @@ -34,10 +35,10 @@ }, }, "content-scraper": { - "name": "mcp-content-scraper", + "name": "content-scraper", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "@supabase/supabase-js": "^2.49.0", "zod": "^4.0.0", }, @@ -118,7 +119,7 @@ "name": "google-calendar", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "zod": "^4.0.0", }, "devDependencies": { @@ -132,7 +133,7 @@ "name": "google-tag-manager", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "zod": "^4.0.0", }, "devDependencies": { @@ -148,7 +149,7 @@ "dependencies": { "@ai-sdk/mcp": "^1.0.1", "@decocms/bindings": "^1.0.7", - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "@jitl/quickjs-singlefile-cjs-release-sync": "^0.31.0", "@modelcontextprotocol/sdk": "^1.25.1", "@radix-ui/react-collapsible": "^1.1.12", @@ -185,7 +186,7 @@ "name": "meta-ads", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "zod": "^4.0.0", }, "devDependencies": { @@ -264,8 +265,8 @@ "dependencies": { "@ai-sdk/provider": "^3.0.2", "@ai-sdk/provider-utils": "^4.0.4", - "@decocms/bindings": "^1.0.6", - "@decocms/runtime": "^1.1.1", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.2", "@openrouter/ai-sdk-provider": "^1.5.4", "@openrouter/sdk": "^0.3.11", "ai": "^6.0.3", @@ -371,7 +372,7 @@ "version": "1.0.0", "dependencies": { "@decocms/bindings": "^1.0.4", - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "@supabase/supabase-js": "^2.89.0", "zod": "^4.0.0", }, @@ -411,7 +412,7 @@ "name": "@decocms/mcps-shared", "version": "1.0.0", "devDependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "@types/bun": "^1.2.14", "vite": "7.2.0", "zod": "^4.0.0", @@ -544,7 +545,7 @@ "@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.33", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.12" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-egqr9PHqqX2Am5mn/Xs1C3+1/wphVKiAjpsVpW85eLc2WpW7AgiAg52DCBr4By9bw3UVVuMeR4uEO1X0dKDUDA=="], - "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.9", "", { "dependencies": { "@ai-sdk/provider": "3.0.2", "@ai-sdk/provider-utils": "4.0.4", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-EA5dZIukimwoJ9HIPuuREotAqaTItpdc/yImzVF0XGNg7B0YRJmYI8Uq3aCMr87vjr1YB1cWUfnrTt6OJ9eHiQ=="], + "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "3.0.2", "@ai-sdk/provider-utils": "4.0.4", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-sRlPMKd38+fdp2y11USW44c0o8tsIsT6T/pgyY04VXC3URjIRnkxugxd9AkU2ogfpPDMz50cBAGPnMxj+6663Q=="], "@ai-sdk/google-v5": ["@ai-sdk/google@2.0.40", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-E7MTVE6vhWXQJzXQDvojwA9t5xlhWpxttCH3R/kUyiE6y0tT8Ay2dmZLO+bLpFBQ5qrvBMrjKWpDVQMoo6TJZg=="], @@ -588,75 +589,75 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.962.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-node": "3.962.0", "@aws-sdk/middleware-bucket-endpoint": "3.957.0", "@aws-sdk/middleware-expect-continue": "3.957.0", "@aws-sdk/middleware-flexible-checksums": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-location-constraint": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-sdk-s3": "3.957.0", "@aws-sdk/middleware-ssec": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/signature-v4-multi-region": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/eventstream-serde-browser": "^4.2.7", "@smithy/eventstream-serde-config-resolver": "^4.3.7", "@smithy/eventstream-serde-node": "^4.2.7", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-blob-browser": "^4.2.8", "@smithy/hash-node": "^4.2.7", "@smithy/hash-stream-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/md5-js": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-I2/1McBZCcM3PfM4ck8D6gnZR3K7+yl1fGkwTq/3ThEn9tdLjNwcdgTbPfxfX6LoecLrH9Ekoo+D9nmQ0T261w=="], + "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.965.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/credential-provider-node": "3.965.0", "@aws-sdk/middleware-bucket-endpoint": "3.965.0", "@aws-sdk/middleware-expect-continue": "3.965.0", "@aws-sdk/middleware-flexible-checksums": "3.965.0", "@aws-sdk/middleware-host-header": "3.965.0", "@aws-sdk/middleware-location-constraint": "3.965.0", "@aws-sdk/middleware-logger": "3.965.0", "@aws-sdk/middleware-recursion-detection": "3.965.0", "@aws-sdk/middleware-sdk-s3": "3.965.0", "@aws-sdk/middleware-ssec": "3.965.0", "@aws-sdk/middleware-user-agent": "3.965.0", "@aws-sdk/region-config-resolver": "3.965.0", "@aws-sdk/signature-v4-multi-region": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@aws-sdk/util-user-agent-browser": "3.965.0", "@aws-sdk/util-user-agent-node": "3.965.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/eventstream-serde-browser": "^4.2.7", "@smithy/eventstream-serde-config-resolver": "^4.3.7", "@smithy/eventstream-serde-node": "^4.2.7", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-blob-browser": "^4.2.8", "@smithy/hash-node": "^4.2.7", "@smithy/hash-stream-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/md5-js": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-BTeaaU1iK0BfatTCrtYjNkIHCoZH256qOI18l9bK4z6mVOgpHkYN4RvOu+NnKgyX58n+HWfOuhtKUD4OE33Vdw=="], - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.958.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg=="], + "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.965.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/middleware-host-header": "3.965.0", "@aws-sdk/middleware-logger": "3.965.0", "@aws-sdk/middleware-recursion-detection": "3.965.0", "@aws-sdk/middleware-user-agent": "3.965.0", "@aws-sdk/region-config-resolver": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@aws-sdk/util-user-agent-browser": "3.965.0", "@aws-sdk/util-user-agent-node": "3.965.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-iv2tr+n4aZ+nPUFFvG00hISPuEd4DU+1/Q8rPAYKXsM+vEPJ2nAnP5duUOa2fbOLIUCRxX3dcQaQaghVHDHzQw=="], - "@aws-sdk/core": ["@aws-sdk/core@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@aws-sdk/xml-builder": "3.957.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-DrZgDnF1lQZv75a52nFWs6MExihJF2GZB6ETZRqr6jMwhrk2kbJPUtvgbifwcL7AYmVqHQDJBrR/MqkwwFCpiw=="], + "@aws-sdk/core": ["@aws-sdk/core@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@aws-sdk/xml-builder": "3.965.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-aq9BhQxdHit8UUJ9C0im9TtuKeK0pT6NXmNJxMTCFeStI7GG7ImIsSislg3BZTIifVg1P6VLdzMyz9de85iutQ=="], - "@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.957.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-qSwSfI+qBU9HDsd6/4fM9faCxYJx2yDuHtj+NVOQ6XYDWQzFab/hUdwuKZ77Pi6goLF1pBZhJ2azaC2w7LbnTA=="], + "@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.965.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-9FbIyJ/Zz1AdEIrb0+Pn7wRi+F/0Y566ooepg0hDyHUzRV3ZXKjOlu3wJH3YwTz2UkdwQmldfUos2yDJps7RyA=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-475mkhGaWCr+Z52fOOVb/q2VHuNvqEDixlYIkeaO6xJ6t9qR0wpLt4hOQaR6zR1wfZV0SlE7d8RErdYq/PByog=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-mdGnaIjMxTIjsb70dEj3VsWPWpoq1V5MWzBSfJq2H8zgMBXjn6d5/qHP8HMf53l9PrsgqzMpXGv3Av549A2x1g=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/node-http-handler": "^4.4.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-8dS55QHRxXgJlHkEYaCGZIhieCs9NU1HU1BcqQ4RfUdSsfRdxxktqUKgCnBnOOn0oD3PPA8cQOCAVgIyRb3Rfw=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/node-http-handler": "^4.4.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-YuGQel9EgA/z25oeLM+GYYQS750+8AESvr7ZEmVnRPL0sg+K3DmGqdv+9gFjFd0UkLjTlC/jtbP2cuY6UcPiHQ=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.962.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", "@aws-sdk/credential-provider-login": "3.962.0", "@aws-sdk/credential-provider-process": "3.957.0", "@aws-sdk/credential-provider-sso": "3.958.0", "@aws-sdk/credential-provider-web-identity": "3.958.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-h0kVnXLW2d3nxbcrR/Pfg3W/+YoCguasWz7/3nYzVqmdKarGrpJzaFdoZtLgvDSZ8VgWUC4lWOTcsDMV0UNqUQ=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/credential-provider-env": "3.965.0", "@aws-sdk/credential-provider-http": "3.965.0", "@aws-sdk/credential-provider-login": "3.965.0", "@aws-sdk/credential-provider-process": "3.965.0", "@aws-sdk/credential-provider-sso": "3.965.0", "@aws-sdk/credential-provider-web-identity": "3.965.0", "@aws-sdk/nested-clients": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-xRo72Prer5s0xYVSCxCymVIRSqrVlevK5cmU0GWq9yJtaBNpnx02jwdJg80t/Ni7pgbkQyFWRMcq38c1tc6M/w=="], - "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.962.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-kHYH6Av2UifG3mPkpPUNRh/PuX6adaAcpmsclJdHdxlixMCRdh8GNeEihq480DC0GmfqdpoSf1w2CLmLLPIS6w=="], + "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/nested-clients": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-43/H8Qku8LHyugbhLo8kjD+eauhybCeVkmrnvWl8bXNHJP7xi1jCdtBQJKKJqiIHZws4MOEwkji8kFdAVRCe6g=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.962.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", "@aws-sdk/credential-provider-ini": "3.962.0", "@aws-sdk/credential-provider-process": "3.957.0", "@aws-sdk/credential-provider-sso": "3.958.0", "@aws-sdk/credential-provider-web-identity": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-CS78NsWRxLa+nWqeWBEYMZTLacMFIXs1C5WJuM9kD05LLiWL32ksljoPsvNN24Bc7rCSQIIMx/U3KGvkDVZMVg=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.965.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.965.0", "@aws-sdk/credential-provider-http": "3.965.0", "@aws-sdk/credential-provider-ini": "3.965.0", "@aws-sdk/credential-provider-process": "3.965.0", "@aws-sdk/credential-provider-sso": "3.965.0", "@aws-sdk/credential-provider-web-identity": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-cRxmMHF+Zh2lkkkEVduKl+8OQdtg/DhYA69+/7SPSQURlgyjFQGlRQ58B7q8abuNlrGT3sV+UzeOylZpJbV61Q=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-/KIz9kadwbeLy6SKvT79W81Y+hb/8LMDyeloA2zhouE28hmne+hLn0wNCQXAAupFFlYOAtZR2NTBs7HBAReJlg=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-gmkPmdiR0yxnTzLPDb7rwrDhGuCUjtgnj8qWP+m0gSz/W43rR4jRPVEf6DUX2iC+ImQhxo3NFhuB3V42Kzo3TQ=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.958.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.958.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/token-providers": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.965.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.965.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/token-providers": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-N01AYvtCqG3Wo/s/LvYt19ity18/FqggiXT+elAs3X9Om/Wfx+hw9G+i7jaDmy+/xewmv8AdQ2SK5Q30dXw/Fw=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.958.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/nested-clients": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-T4gMZ2JzXnfxe1oTD+EDGLSxFfk1+WkLZdiHXEMZp8bFI1swP/3YyDFXI+Ib9Uq1JhnAmrCXtOnkicKEhDkdhQ=="], - "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@aws-sdk/util-arn-parser": "3.957.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-iczcn/QRIBSpvsdAS/rbzmoBpleX1JBjXvCynMbDceVLBIcVrwT1hXECrhtIC2cjh4HaLo9ClAbiOiWuqt+6MA=="], + "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@aws-sdk/util-arn-parser": "3.965.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-gbdv3Dl8l8xmg4oH60fXvfDyTxfx28w5/Hxdymx3vurM07tAyd4qld8zEXejnSpraTo45QcHRtk5auELIMfeag=="], - "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-AlbK3OeVNwZZil0wlClgeI/ISlOt/SPUxBsIns876IFaVu/Pj3DgImnYhpcJuFRek4r4XM51xzIaGQXM6GDHGg=="], + "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-UBxVytsmhEmFwkBnt+aV0eAJ7uc+ouNokCqMBrQ7Oc5A77qhlcHfOgXIKz2SxqsiYTsDq+a0lWFM/XpyRWraqA=="], - "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.957.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/crc64-nvme": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-iJpeVR5V8se1hl2pt+k8bF/e9JO4KWgPCMjg8BtRspNtKIUGy7j6msYvbDixaKZaF2Veg9+HoYcOhwnZumjXSA=="], + "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.965.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/crc64-nvme": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-5rzEW08trcpHMe6jkQyYc4PL1KG/H7BbnySFSzhih+r/gktQEiE36sb1BNf7av9I0Vk2Ccmt7wocB5PIT7GDkQ=="], - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-BBgKawVyfQZglEkNTuBBdC3azlyqNXsvvN4jPkWAiNYcY0x1BasaJFl+7u/HisfULstryweJq/dAvIZIxzlZaA=="], + "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-SfpSYqoPOAmdb3DBsnNsZ0vix+1VAtkUkzXM79JL3R5IfacpyKE2zytOgVAQx/FjhhlpSTwuXd+LRhUEVb3MaA=="], - "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-y8/W7TOQpmDJg/fPYlqAhwA4+I15LrS7TwgUEoxogtkD8gfur9wFMRLT8LCyc9o4NMEcAnK50hSb4+wB0qv6tQ=="], + "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-07T1rwAarQs33mVg5U28AsSdLB5JUXu9yBTBmspFGajKVsEahIyntf53j9mAXF1N2KR0bNdP0J4A0kst4t43UQ=="], - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-w1qfKrSKHf9b5a8O76yQ1t69u6NWuBjr5kBX+jRWFx/5mu6RLpqERXRpVJxfosbep7k3B+DSB5tZMZ82GKcJtQ=="], + "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-gjUvJRZT1bUABKewnvkj51LAynFrfz2h5DYAg5/2F4Utx6UOGByTSr9Rq8JCLbURvvzAbCtcMkkIJRxw+8Zuzw=="], - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA=="], + "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-6dvD+18Ni14KCRu+tfEoNxq1sIGVp9tvoZDZ7aMvpnA7mDXuRLrOjRQ/TAZqXwr9ENKVGyxcPl0cRK8jk1YWjA=="], - "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-arn-parser": "3.957.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-5B2qY2nR2LYpxoQP0xUum5A1UNvH2JQpLHDH1nWFNF/XetV7ipFHksMxPNhtJJ6ARaWhQIDXfOUj0jcnkJxXUg=="], + "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-arn-parser": "3.965.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-dXEgnojaaVRl+OlOx35mg3rYEbfffIN4X6tLmIfDnaKz0hMaDMvsE9jJXb/vBvokbdO1sVB27/2FEM4ttLSLnw=="], - "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-qwkmrK0lizdjNt5qxl4tHYfASh8DFpHXM1iDVo+qHe+zuslfMqQEGRkzxS8tJq/I+8F0c6v3IKOveKJAfIvfqQ=="], + "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-dke++CTw26y+a2D1DdVuZ4+2TkgItdx6TeuE0zOl4lsqXGvTBUG4eaIZalt7ZOAW5ys2pbDOk1bPuh4opoD3pQ=="], - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@smithy/core": "^3.20.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-50vcHu96XakQnIvlKJ1UoltrFODjsq2KvtTgHiPFteUS884lQnK5VC/8xd1Msz/1ONpLMzdCVproCQqhDTtMPQ=="], + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@smithy/core": "^3.20.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-RBEYVGgu/WeAt+H/qLrGc+t8LqAUkbyvh3wBfTiuAD+uBcWsKnvnB1iSBX75FearC0fmoxzXRUc0PMxMdqpjJQ=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.958.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.965.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.965.0", "@aws-sdk/middleware-host-header": "3.965.0", "@aws-sdk/middleware-logger": "3.965.0", "@aws-sdk/middleware-recursion-detection": "3.965.0", "@aws-sdk/middleware-user-agent": "3.965.0", "@aws-sdk/region-config-resolver": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-endpoints": "3.965.0", "@aws-sdk/util-user-agent-browser": "3.965.0", "@aws-sdk/util-user-agent-node": "3.965.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-muNVUjUEU+/KLFrLzQ8PMXyw4+a/MP6t4GIvwLtyx/kH0rpSy5s0YmqacMXheuIe6F/5QT8uksXGNAQenitkGQ=="], - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A=="], + "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/config-resolver": "^4.4.5", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-RoMhu9ly2B0coxn8ctXosPP2WmDD0MkQlZGLjoYHQUOCBmty5qmCxOqBmBDa6wbWbB8xKtMQ/4VXloQOgzjHXg=="], - "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.962.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-format-url": "3.957.0", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-tyxsGfLY4NSohLrJsFGXbE3j8jguWK+hdGaUQSD1gJPvmC0B82qOyJ7WBIJLWgTabU3fiF/I9EGXjzR2rKr8jQ=="], + "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.965.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.965.0", "@aws-sdk/types": "3.965.0", "@aws-sdk/util-format-url": "3.965.0", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-aQ9vvXjeoQsAaRHS18l8doY+E/6mmNMSDMU6eJsSUDgvgGRMHhsKjiVh7DJGbZRRogdrES4KAfx6raIB4kBz5Q=="], - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.957.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-t6UfP1xMUigMMzHcb7vaZcjv7dA2DQkk9C/OAP1dKyrE0vb4lFGDaTApi17GN6Km9zFxJthEMUbBc7DL0hq1Bg=="], + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.965.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-hgbAThbsUrWtNpFBQxzXevIfd5Qgr4TLbXY1AIbmpSX9fPVC114pdieRMpopJ0fYaJ7v5/blTiS6wzVdXleZ/w=="], - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.958.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-UCj7lQXODduD1myNJQkV+LYcGYJ9iiMggR8ow8Hva1g3A/Na5imNXzz6O67k7DAee0TYpy+gkNw+SizC6min8Q=="], + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.965.0", "", { "dependencies": { "@aws-sdk/core": "3.965.0", "@aws-sdk/nested-clients": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-aR0qxg0b8flkXJVE+CM1gzo7uJ57md50z2eyCwofC0QIz5Y0P7/7vvb9/dmUQt6eT9XRN5iRcUqq2IVxVDvJOw=="], - "@aws-sdk/types": ["@aws-sdk/types@3.957.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg=="], + "@aws-sdk/types": ["@aws-sdk/types@3.965.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-jvodoJdMavvg8faN7co58vVJRO5MVep4JFPRzUNCzpJ98BDqWDk/ad045aMJcmxkLzYLS2UAnUmqjJ/tUPNlzQ=="], - "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.957.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Aj6m+AyrhWyg8YQ4LDPg2/gIfGHCEcoQdBt5DeSFogN5k9mmJPOJ+IAmNSWmWRjpOxEy6eY813RNDI6qS97M0g=="], + "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.965.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-bNGKr5Tct28jGLkL8xIkGu7swpDgBpkTVbGaofhzr/X80iclbOv656RGxhMpDvmc4S9UuQnqLRXyceNFNF2V7Q=="], - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-endpoints": "^3.2.7", "tslib": "^2.6.2" } }, "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw=="], + "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-endpoints": "^3.2.7", "tslib": "^2.6.2" } }, "sha512-WqSCB0XIsGUwZWvrYkuoofi2vzoVHqyeJ2kN+WyoOsxPLTiQSBIoqm/01R/qJvoxwK/gOOF7su9i84Vw2NQQpQ=="], - "@aws-sdk/util-format-url": ["@aws-sdk/util-format-url@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/querystring-builder": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-Yyo/tlc0iGFGTPPkuxub1uRAv6XrnVnvSNjslZh5jIYA8GZoeEFPgJa3Qdu0GUS/YwoK8GOLnnaL9h/eH5LDJQ=="], + "@aws-sdk/util-format-url": ["@aws-sdk/util-format-url@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/querystring-builder": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-KiplV4xYGXdNCcz5eRP8WfAejT5EkE2gQxC4IY6WsuxYprzQKsnGaAzEQ+giR5GgQLIRBkPaWT0xHEYkMiCQ1Q=="], - "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.957.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-nhmgKHnNV9K+i9daumaIz8JTLsIIML9PE/HUks5liyrjUzenjW/aHoc7WJ9/Td/gPZtayxFnXQSJRb/fDlBuJw=="], + "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-9LJFand4bIoOjOF4x3wx0UZYiFZRo4oUauxQSiEX2dVg+5qeBOJSjp2SeWykIE6+6frCZ5wvWm2fGLK8D32aJw=="], - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw=="], + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.965.0", "", { "dependencies": { "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-Xiza/zMntQGpkd2dETQeAK8So1pg5+STTzpcdGWxj5q0jGO5ayjqT/q1Q7BrsX5KIr6PvRkl9/V7lLCv04wGjQ=="], - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.957.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-ycbYCwqXk4gJGp0Oxkzf2KBeeGBdTxz559D41NJP8FlzSej1Gh7Rk40Zo6AyTfsNWkrl/kVi1t937OIzC5t+9Q=="], + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.965.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.965.0", "@aws-sdk/types": "3.965.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-kokIHUfNT3/P55E4fUJJrFHuuA9BbjFKUIxoLrd3UaRfdafT0ScRfg2eaZie6arf60EuhlUIZH0yALxttMEjxQ=="], - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.957.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-Ai5iiQqS8kJ5PjzMhWcLKN0G2yasAkvpnPlq2EnqlIMdB48HsizElt62qcktdxp4neRMyGkFq4NzgmDbXnhRiA=="], + "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.965.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-Tcod25/BTupraQwtb+Q+GX8bmEZfxIFjjJ/AvkhUZsZlkPeVluzq1uu3Oeqf145DCdMjzLIN6vab5MrykbDP+g=="], "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.2", "", {}, "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg=="], @@ -700,21 +701,21 @@ "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.1", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg=="], - "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.7.13", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251202.0" }, "optionalPeers": ["workerd"] }, "sha512-NulO1H8R/DzsJguLC0ndMuk4Ufv0KSlN+E54ay9rn9ZCQo0kpAPwwh3LhgpZ96a3Dr6L9LqW57M4CqC34iLOvw=="], + "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.8.0", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251202.0" }, "optionalPeers": ["workerd"] }, "sha512-oIAu6EdQ4zJuPwwKr9odIEqd8AV96z1aqi3RBEA4iKaJ+Vd3fvuI6m5EDC7/QCv+oaPIhy1SkYBYxmD09N+oZg=="], - "@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.17.1", "", { "dependencies": { "@cloudflare/unenv-preset": "2.7.13", "@remix-run/node-fetch-server": "^0.8.0", "defu": "^6.1.4", "get-port": "^7.1.0", "miniflare": "4.20251210.0", "picocolors": "^1.1.1", "tinyglobby": "^0.2.12", "unenv": "2.0.0-rc.24", "wrangler": "4.54.0", "ws": "8.18.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0" } }, "sha512-QHxTDhvJakWCs4mu7Q6fB02CPT5MvZkyxufwX7dCIDqLfav5ohIQ7+wdTU7AYwPJ7tF8/a82dBpwnt7+wHooXg=="], + "@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.20.1", "", { "dependencies": { "@cloudflare/unenv-preset": "2.8.0", "@remix-run/node-fetch-server": "^0.8.0", "defu": "^6.1.4", "get-port": "^7.1.0", "miniflare": "4.20260107.0", "picocolors": "^1.1.1", "tinyglobby": "^0.2.12", "unenv": "2.0.0-rc.24", "wrangler": "4.58.0", "ws": "8.18.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0" } }, "sha512-hKe2ghXFAWG4s2c08LQZao5Ymt0HBC/XqrUINowHhru2ylnjGp3uuMnI/J1eKpkw1TBdR3weT/EvwT/XtS/b5A=="], - "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20251210.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Nn9X1moUDERA9xtFdCQ2XpQXgAS9pOjiCxvOT8sVx9UJLAiBLkfSCGbpsYdarODGybXCpjRlc77Yppuolvt7oQ=="], + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260107.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Srwe/IukVppkMU2qTndkFaKCmZBI7CnZoq4Y0U0gD/8158VGzMREHTqCii4IcCeHifwrtDqTWu8EcA1VBKI4mg=="], - "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20251210.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw=="], + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260107.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-aAYwU7zXW+UZFh/a4vHP5cs1ulTOcDRLzwU9547yKad06RlZ6ioRm7ovjdYvdqdmbI8mPd99v4LN9gMmecazQw=="], - "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20251210.0", "", { "os": "linux", "cpu": "x64" }, "sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g=="], + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260107.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Wh7xWtFOkk6WY3CXe3lSqZ1anMkFcwy+qOGIjtmvQ/3nCOaG34vKNwPIE9iwryPupqkSuDmEqkosI1UUnSTh1A=="], - "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20251210.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA=="], + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260107.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-NI0/5rdssdZZKYHxNG4umTmMzODByq86vSCEk8u4HQbGhRCQo7rV1eXn84ntSBdyWBzWdYGISCbeZMsgfIjSTg=="], - "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20251210.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw=="], + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260107.1", "", { "os": "win32", "cpu": "x64" }, "sha512-gmBMqs606Gd/IhBEBPSL/hJAqy2L8IyPUjKtoqd/Ccy7GQxbSc0rYlRkxbQ9YzmqnuhrTVYvXuLscyWrpmAJkw=="], - "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260103.0", "", {}, "sha512-jANmoGpJcXARnwlkvrQOeWyjYD1quTfHcs+++Z544XRHOSfLc4XSlts7snIhbiIGgA5bo66zDhraF+9lKUr2hw=="], + "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260108.0", "", {}, "sha512-0SuzZ7SeMB35X0wL2rhsEQG1dmfAGY8N8z7UwrkFb6hxerxwXP4QuIzcF8HtCJTRTjChmarxV+HQC+ADB4UK1A=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], @@ -726,7 +727,7 @@ "@decocms/mcps-shared": ["@decocms/mcps-shared@workspace:shared"], - "@decocms/runtime": ["@decocms/runtime@1.1.1", "", { "dependencies": { "@ai-sdk/provider": "^3.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.7", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-rGyqX57JfNAguHYFgvdpTJU3Zfg0svqrBDCbizRSVO/IptGt0dph1EhdjRwlqyCaMNl70uk/hUsb8aMuOFj+KQ=="], + "@decocms/runtime": ["@decocms/runtime@1.1.2", "", { "dependencies": { "@ai-sdk/provider": "^3.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "^1.0.7", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-yReIcawmbUJ1wAtJo0SlU0gFj+y2jYC3XXz6iIVG0e6pIHyvIz8WodbRnxNAVXn1YQNroZedrUanqpGgJOOFtw=="], "@decocms/vite-plugin": ["@decocms/vite-plugin@1.0.0-alpha.1", "", { "dependencies": { "@cloudflare/vite-plugin": "^1.13.4", "vite": "7.2.0" } }, "sha512-DI9zNH49pVk8aQ+7rNYwqTZhjQ4RZDA+kA1t3ifwc4RLJsOtYv8LOXERRZnou7CcKVTdXPB06M8gbMWPpSaq8w=="], @@ -962,9 +963,9 @@ "@opentelemetry/auto-instrumentations-node": ["@opentelemetry/auto-instrumentations-node@0.62.2", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.203.0", "@opentelemetry/instrumentation-amqplib": "^0.50.0", "@opentelemetry/instrumentation-aws-lambda": "^0.54.1", "@opentelemetry/instrumentation-aws-sdk": "^0.58.0", "@opentelemetry/instrumentation-bunyan": "^0.49.0", "@opentelemetry/instrumentation-cassandra-driver": "^0.49.0", "@opentelemetry/instrumentation-connect": "^0.47.0", "@opentelemetry/instrumentation-cucumber": "^0.19.0", "@opentelemetry/instrumentation-dataloader": "^0.21.1", "@opentelemetry/instrumentation-dns": "^0.47.0", "@opentelemetry/instrumentation-express": "^0.52.0", "@opentelemetry/instrumentation-fastify": "^0.48.0", "@opentelemetry/instrumentation-fs": "^0.23.0", "@opentelemetry/instrumentation-generic-pool": "^0.47.0", "@opentelemetry/instrumentation-graphql": "^0.51.0", "@opentelemetry/instrumentation-grpc": "^0.203.0", "@opentelemetry/instrumentation-hapi": "^0.50.0", "@opentelemetry/instrumentation-http": "^0.203.0", "@opentelemetry/instrumentation-ioredis": "^0.51.0", "@opentelemetry/instrumentation-kafkajs": "^0.13.0", "@opentelemetry/instrumentation-knex": "^0.48.0", "@opentelemetry/instrumentation-koa": "^0.51.0", "@opentelemetry/instrumentation-lru-memoizer": "^0.48.0", "@opentelemetry/instrumentation-memcached": "^0.47.0", "@opentelemetry/instrumentation-mongodb": "^0.56.0", "@opentelemetry/instrumentation-mongoose": "^0.50.0", "@opentelemetry/instrumentation-mysql": "^0.49.0", "@opentelemetry/instrumentation-mysql2": "^0.50.0", "@opentelemetry/instrumentation-nestjs-core": "^0.49.0", "@opentelemetry/instrumentation-net": "^0.47.0", "@opentelemetry/instrumentation-oracledb": "^0.29.0", "@opentelemetry/instrumentation-pg": "^0.56.1", "@opentelemetry/instrumentation-pino": "^0.50.1", "@opentelemetry/instrumentation-redis": "^0.52.0", "@opentelemetry/instrumentation-restify": "^0.49.0", "@opentelemetry/instrumentation-router": "^0.48.0", "@opentelemetry/instrumentation-runtime-node": "^0.17.1", "@opentelemetry/instrumentation-socket.io": "^0.50.0", "@opentelemetry/instrumentation-tedious": "^0.22.0", "@opentelemetry/instrumentation-undici": "^0.14.0", "@opentelemetry/instrumentation-winston": "^0.48.1", "@opentelemetry/resource-detector-alibaba-cloud": "^0.31.3", "@opentelemetry/resource-detector-aws": "^2.3.0", "@opentelemetry/resource-detector-azure": "^0.10.0", "@opentelemetry/resource-detector-container": "^0.7.3", "@opentelemetry/resource-detector-gcp": "^0.37.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-node": "^0.203.0" }, "peerDependencies": { "@opentelemetry/api": "^1.4.1", "@opentelemetry/core": "^2.0.0" } }, "sha512-Ipe6X7ddrCiRsuewyTU83IvKiSFT4piqmv9z8Ovg1E7v98pdTj1pUE6sDrHV50zl7/ypd+cONBgt+EYSZu4u9Q=="], - "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.2.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ=="], + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.3.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-hGcsT0qDP7Il1L+qT3JFpiGl1dCjF794Bb4yCRCYdr7XC0NwHtOF3ngF86Gk6TUnsakbyQsDQ0E/S4CU0F4d4g=="], - "@opentelemetry/core": ["@opentelemetry/core@2.2.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw=="], + "@opentelemetry/core": ["@opentelemetry/core@2.3.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-PcmxJQzs31cfD0R2dE91YGFcLxOSN4Bxz7gez5UwSUjCai8BwH/GI5HchfVshHkWdTkUs0qcaPJgVHKXUp7I3A=="], "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.203.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.203.0", "@opentelemetry/otlp-grpc-exporter-base": "0.203.0", "@opentelemetry/otlp-transformer": "0.203.0", "@opentelemetry/sdk-logs": "0.203.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-g/2Y2noc/l96zmM+g0LdeuyYKINyBwN6FJySoU15LHPLcMN/1a0wNk2SegwKcxrRdE7Xsm7fkIR5n6XFe3QpPw=="], @@ -1094,17 +1095,17 @@ "@opentelemetry/resource-detector-gcp": ["@opentelemetry/resource-detector-gcp@0.37.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0", "gcp-metadata": "^6.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-LGpJBECIMsVKhiulb4nxUw++m1oF4EiDDPmFGW2aqYaAF0oUvJNv8Z/55CAzcZ7SxvlTgUwzewXDBsuCup7iqw=="], - "@opentelemetry/resources": ["@opentelemetry/resources@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A=="], + "@opentelemetry/resources": ["@opentelemetry/resources@2.3.0", "", { "dependencies": { "@opentelemetry/core": "2.3.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-shlr2l5g+87J8wqYlsLyaUsgKVRO7RtX70Ckd5CtDOWtImZgaUDmf4Z2ozuSKQLM2wPDR0TE/3bPVBNJtRm/cQ=="], "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.203.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.203.0", "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw=="], - "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-G5KYP6+VJMZzpGipQw7Giif48h6SGQ2PFKEYCybeXJsOCB4fp8azqMAAzE5lnnHK3ZVwYQrgmFbsUJO/zOnwGw=="], + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.3.0", "", { "dependencies": { "@opentelemetry/core": "2.3.0", "@opentelemetry/resources": "2.3.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-P+bYQgJHf6hRKgsR7xDnbNPDP+x1DwGtse6gHAPZ/iwMGbtQPVvhyFK1lseow5o3kLxNEaQv4lDqAF/vpRdXxA=="], "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.203.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.203.0", "@opentelemetry/core": "2.0.1", "@opentelemetry/exporter-logs-otlp-grpc": "0.203.0", "@opentelemetry/exporter-logs-otlp-http": "0.203.0", "@opentelemetry/exporter-logs-otlp-proto": "0.203.0", "@opentelemetry/exporter-metrics-otlp-grpc": "0.203.0", "@opentelemetry/exporter-metrics-otlp-http": "0.203.0", "@opentelemetry/exporter-metrics-otlp-proto": "0.203.0", "@opentelemetry/exporter-prometheus": "0.203.0", "@opentelemetry/exporter-trace-otlp-grpc": "0.203.0", "@opentelemetry/exporter-trace-otlp-http": "0.203.0", "@opentelemetry/exporter-trace-otlp-proto": "0.203.0", "@opentelemetry/exporter-zipkin": "2.0.1", "@opentelemetry/instrumentation": "0.203.0", "@opentelemetry/propagator-b3": "2.0.1", "@opentelemetry/propagator-jaeger": "2.0.1", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-logs": "0.203.0", "@opentelemetry/sdk-metrics": "2.0.1", "@opentelemetry/sdk-trace-base": "2.0.1", "@opentelemetry/sdk-trace-node": "2.0.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-zRMvrZGhGVMvAbbjiNQW3eKzW/073dlrSiAKPVWmkoQzah9wfynpVPeL55f9fVIm0GaBxTLcPeukWGy0/Wj7KQ=="], - "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.2.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw=="], + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.3.0", "", { "dependencies": { "@opentelemetry/core": "2.3.0", "@opentelemetry/resources": "2.3.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-B0TQ2e9h0ETjpI+eGmCz8Ojb+lnYms0SE3jFwEKrN/PK4aSVHU28AAmnOoBmfub+I3jfgPwvDJgomBA5a7QehQ=="], - "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.2.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.2.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-+OaRja3f0IqGG2kptVeYsrZQK9nKRSpfFrKtRBq4uh6nIB8bTBgaGvYQrQoRrQWQMA5dK5yLhDMDc0dvYvCOIQ=="], + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.3.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.3.0", "@opentelemetry/core": "2.3.0", "@opentelemetry/sdk-trace-base": "2.3.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-oGsG3vIiC8zYjOWE4CgtS6d2gQhp4pT04AI9UL1wtJOxTSNVZiiIPgHnOp/qKJSwkD4YJHSohi6inSilPmGM2Q=="], "@opentelemetry/sdk-trace-web": ["@opentelemetry/sdk-trace-web@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SS6JaSkHngcBCNdWGthzcvaKGRnDw2AeP57HyTEileLToJ7WLMeV+064iRlVyoT4+e77MRp2T2dDSrmaUyxoNg=="], @@ -1290,7 +1291,7 @@ "@smithy/config-resolver": ["@smithy/config-resolver@4.4.5", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg=="], - "@smithy/core": ["@smithy/core@3.20.0", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.8", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ=="], + "@smithy/core": ["@smithy/core@3.20.1", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.8", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-wOboSEdQ85dbKAJ0zL+wQ6b0HTSBRhtGa0PYKysQXkRg+vK0tdCRRVruiFM2QMprkOQwSYOnwF4og96PAaEGag=="], "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.7", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA=="], @@ -1320,9 +1321,9 @@ "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.7", "", { "dependencies": { "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg=="], - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.1", "", { "dependencies": { "@smithy/core": "^3.20.0", "@smithy/middleware-serde": "^4.2.8", "@smithy/node-config-provider": "^4.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg=="], + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.2", "", { "dependencies": { "@smithy/core": "^3.20.1", "@smithy/middleware-serde": "^4.2.8", "@smithy/node-config-provider": "^4.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-mqpAdux0BNmZu/SqkFhQEnod4fX23xxTvU2LUpmKp0JpSI+kPYCiHJMmzREr8yxbNxKL2/DU1UZm9i++ayU+2g=="], - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.17", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/service-error-classification": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg=="], + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.18", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/service-error-classification": "^4.2.7", "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-E5hulijA59nBk/zvcwVMaS7FG7Y4l6hWA9vrW018r+8kiZef4/ETQaPI4oY+3zsy9f6KqDv3c4VKtO4DwwgpCg=="], "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.8", "", { "dependencies": { "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w=="], @@ -1346,7 +1347,7 @@ "@smithy/signature-v4": ["@smithy/signature-v4@5.3.7", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg=="], - "@smithy/smithy-client": ["@smithy/smithy-client@4.10.2", "", { "dependencies": { "@smithy/core": "^3.20.0", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-stack": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g=="], + "@smithy/smithy-client": ["@smithy/smithy-client@4.10.3", "", { "dependencies": { "@smithy/core": "^3.20.1", "@smithy/middleware-endpoint": "^4.4.2", "@smithy/middleware-stack": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-EfECiO/0fAfb590LBnUe7rI5ux7XfquQ8LBzTe7gxw0j9QW/q8UT/EHWHlxV/+jhQ3+Ssga9uUYXCQgImGMbNg=="], "@smithy/types": ["@smithy/types@4.11.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA=="], @@ -1362,9 +1363,9 @@ "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q=="], - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.16", "", { "dependencies": { "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ=="], + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.17", "", { "dependencies": { "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-dwN4GmivYF1QphnP3xJESXKtHvkkvKHSZI8GrSKMVoENVSKW2cFPRYC4ZgstYjUHdR3zwaDkIaTDIp26JuY7Cw=="], - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.19", "", { "dependencies": { "@smithy/config-resolver": "^4.4.5", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA=="], + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.20", "", { "dependencies": { "@smithy/config-resolver": "^4.4.5", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-VD/I4AEhF1lpB3B//pmOIMBNLMrtdMXwy9yCOfa2QkJGDr63vH3RqPbSAKzoGMov3iryCxTXCxSsyGmEB8PDpg=="], "@smithy/util-endpoints": ["@smithy/util-endpoints@3.2.7", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg=="], @@ -1388,21 +1389,21 @@ "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@supabase/auth-js": ["@supabase/auth-js@2.89.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-wiWZdz8WMad8LQdJMWYDZ2SJtZP5MwMqzQq3ehtW2ngiI3UTgbKiFrvMUUS3KADiVlk4LiGfODB2mrYx7w2f8w=="], + "@supabase/auth-js": ["@supabase/auth-js@2.90.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-vxb66dgo6h3yyPbR06735Ps+dK3hj0JwS8w9fdQPVZQmocSTlKUW5MfxSy99mN0XqCCuLMQ3jCEiIIUU23e9ng=="], - "@supabase/functions-js": ["@supabase/functions-js@2.89.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-XEueaC5gMe5NufNYfBh9kPwJlP5M2f+Ogr8rvhmRDAZNHgY6mI35RCkYDijd92pMcNM7g8pUUJov93UGUnqfyw=="], + "@supabase/functions-js": ["@supabase/functions-js@2.90.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-x9mV9dF1Lam9qL3zlpP6mSM5C9iqMPtF5B/tU1Jj/F0ufX5mjDf9ghVBaErVxmrQJRL4+iMKWKY2GnODkpS8tw=="], "@supabase/node-fetch": ["@supabase/node-fetch@2.6.15", "", { "dependencies": { "whatwg-url": "^5.0.0" } }, "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ=="], - "@supabase/postgrest-js": ["@supabase/postgrest-js@2.89.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-/b0fKrxV9i7RNOEXMno/I1862RsYhuUo+Q6m6z3ar1f4ulTMXnDfv0y4YYxK2POcgrOXQOgKYQx1eArybyNvtg=="], + "@supabase/postgrest-js": ["@supabase/postgrest-js@2.90.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-jh6vqzaYzoFn3raaC0hcFt9h+Bt+uxNRBSdc7PfToQeRGk7PDPoweHsbdiPWREtDVTGKfu+PyPW9e2jbK+BCgQ=="], - "@supabase/realtime-js": ["@supabase/realtime-js@2.89.0", "", { "dependencies": { "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "tslib": "2.8.1", "ws": "^8.18.2" } }, "sha512-aMOvfDb2a52u6PX6jrrjvACHXGV3zsOlWRzZsTIOAJa0hOVvRp01AwC1+nLTGUzxzezejrYeCX+KnnM1xHdl+w=="], + "@supabase/realtime-js": ["@supabase/realtime-js@2.90.1", "", { "dependencies": { "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "tslib": "2.8.1", "ws": "^8.18.2" } }, "sha512-PWbnEMkcQRuor8jhObp4+Snufkq8C6fBp+MchVp2qBPY1NXk/c3Iv3YyiFYVzo0Dzuw4nAlT4+ahuPggy4r32w=="], "@supabase/ssr": ["@supabase/ssr@0.6.1", "", { "dependencies": { "cookie": "^1.0.1" }, "peerDependencies": { "@supabase/supabase-js": "^2.43.4" } }, "sha512-QtQgEMvaDzr77Mk3vZ3jWg2/y+D8tExYF7vcJT+wQ8ysuvOeGGjYbZlvj5bHYsj/SpC0bihcisnwPrM4Gp5G4g=="], - "@supabase/storage-js": ["@supabase/storage-js@2.89.0", "", { "dependencies": { "iceberg-js": "^0.8.1", "tslib": "2.8.1" } }, "sha512-6zKcXofk/M/4Eato7iqpRh+B+vnxeiTumCIP+Tz26xEqIiywzD9JxHq+udRrDuv6hXE+pmetvJd8n5wcf4MFRQ=="], + "@supabase/storage-js": ["@supabase/storage-js@2.90.1", "", { "dependencies": { "iceberg-js": "^0.8.1", "tslib": "2.8.1" } }, "sha512-GHY+Ps/K/RBfRj7kwx+iVf2HIdqOS43rM2iDOIDpapyUnGA9CCBFzFV/XvfzznGykd//z2dkGZhlZZprsVFqGg=="], - "@supabase/supabase-js": ["@supabase/supabase-js@2.89.0", "", { "dependencies": { "@supabase/auth-js": "2.89.0", "@supabase/functions-js": "2.89.0", "@supabase/postgrest-js": "2.89.0", "@supabase/realtime-js": "2.89.0", "@supabase/storage-js": "2.89.0" } }, "sha512-KlaRwSfFA0fD73PYVMHj5/iXFtQGCcX7PSx0FdQwYEEw9b2wqM7GxadY+5YwcmuEhalmjFB/YvqaoNVF+sWUlg=="], + "@supabase/supabase-js": ["@supabase/supabase-js@2.90.1", "", { "dependencies": { "@supabase/auth-js": "2.90.1", "@supabase/functions-js": "2.90.1", "@supabase/postgrest-js": "2.90.1", "@supabase/realtime-js": "2.90.1", "@supabase/storage-js": "2.90.1" } }, "sha512-U8KaKGLUgTIFHtwEW1dgw1gK7XrdpvvYo7nzzqPx721GqPe8WZbAiLh/hmyKLGBYQ/mmQNr20vU9tWSDZpii3w=="], "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="], @@ -1440,15 +1441,15 @@ "@tanstack/react-query": ["@tanstack/react-query@5.90.16", "", { "dependencies": { "@tanstack/query-core": "5.90.16" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ=="], - "@tanstack/react-router": ["@tanstack/react-router@1.145.7", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/react-store": "^0.8.0", "@tanstack/router-core": "1.145.7", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-0O+a4TjJSPXd2BsvDPwDPBKRQKYqNIBg5TAg9NzCteqJ0NXRxwohyqCksHqCEEtJe/uItwqmHoqkK4q5MDhEsA=="], + "@tanstack/react-router": ["@tanstack/react-router@1.146.0", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/react-store": "^0.8.0", "@tanstack/router-core": "1.146.0", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-aak4/TZrBKS0v74eZmvVsJheXpl0M4LLOBTwVZpiMxbIjbGQMCiHNHqoxW2EpnJBag0OGDHFX6NAsgzf0KGHUQ=="], - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.145.7", "", { "dependencies": { "@tanstack/router-devtools-core": "1.145.7" }, "peerDependencies": { "@tanstack/react-router": "^1.145.7", "@tanstack/router-core": "^1.145.7", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-crzHSQ/rcGX7RfuYsmm1XG5quurNMDTIApU7jfwDx5J9HnUxCOSJrbFX0L3w0o0VRCw5xhrL2EdCnW78Ic86hg=="], + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.146.0", "", { "dependencies": { "@tanstack/router-devtools-core": "1.146.0" }, "peerDependencies": { "@tanstack/react-router": "^1.146.0", "@tanstack/router-core": "^1.146.0", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-FgE7opBF2pwiGY6E/+zKa5RgSPHyhubziO+Qy6Lw0lJv8o2tz+OO4ub+UVQzz86oQXWKx/NJilQ0Fx9KDz6Q8g=="], "@tanstack/react-store": ["@tanstack/react-store@0.8.0", "", { "dependencies": { "@tanstack/store": "0.8.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow=="], - "@tanstack/router-core": ["@tanstack/router-core@1.145.7", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/store": "^0.8.0", "cookie-es": "^2.0.0", "seroval": "^1.4.1", "seroval-plugins": "^1.4.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-v6jx6JqVUBM0/FcBq1tX22xiPq8Ufc0PDEP582/4deYoq2/RYd+bZstANp3mGSsqdxE/luhoLYuuSQiwi/j1wA=="], + "@tanstack/router-core": ["@tanstack/router-core@1.146.0", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/store": "^0.8.0", "cookie-es": "^2.0.0", "seroval": "^1.4.1", "seroval-plugins": "^1.4.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-9AcXViVE4NiKTwaxLhqKbzS1gUqu1ymTmy5TjyEthfYQXGdJWZZnCwj68xc8IpsG/CK8kaa6T1qa4xhLuYZG3g=="], - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.145.7", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@tanstack/router-core": "^1.145.7", "csstype": "^3.0.10", "solid-js": ">=1.9.5" }, "optionalPeers": ["csstype"] }, "sha512-oKeq/6QvN49THCh++FJyPv1X65i20qGS4aJHQTNsl4cu1piW1zWUhab2L3DZVr3G8C40FW3xb6hVw92N/fzZbQ=="], + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.146.0", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@tanstack/router-core": "^1.146.0", "csstype": "^3.0.10", "solid-js": ">=1.9.5" }, "optionalPeers": ["csstype"] }, "sha512-AOFr2YvqtZ+rr4yxrwSmlz9hO58aFgm1Tzr1QH554Rxq7wPH2N1CJYaCj+NvX1urrEyz+cf/CsWo0JUFPTxfVQ=="], "@tanstack/store": ["@tanstack/store@0.8.0", "", {}, "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ=="], @@ -1518,7 +1519,7 @@ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], - "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], + "@types/send": ["@types/send@1.2.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="], "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="], @@ -1546,7 +1547,7 @@ "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], - "ai": ["ai@6.0.13", "", { "dependencies": { "@ai-sdk/gateway": "3.0.9", "@ai-sdk/provider": "3.0.2", "@ai-sdk/provider-utils": "4.0.4", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-xBP/OoYycUAVSF0h3BuU4/EcqAyKYIhu7LB2fPIogk+w5+b42LZXtm3rNtzt5YF0/gFScArLTxs6dhtLQuC48Q=="], + "ai": ["ai@6.0.23", "", { "dependencies": { "@ai-sdk/gateway": "3.0.10", "@ai-sdk/provider": "3.0.2", "@ai-sdk/provider-utils": "4.0.4", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-IV8hqp6sQvZ0XVlu8bCnFlwG7+2d40ff26RZ1k4yw/zVuk2F6SXlONURtTo9vwPOPYeF7auXvyPA+dMDoepWxg=="], "ai-v5": ["ai@5.0.97", "", { "dependencies": { "@ai-sdk/gateway": "2.0.12", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8zBx0b/owis4eJI2tAlV8a1Rv0BANmLxontcAelkLNwEHhgfgXeKpDkhNB6OgV+BJSwboIUDkgd9312DdJnCOQ=="], @@ -1578,7 +1579,7 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.9.11", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ=="], "bidc": ["bidc@0.0.3", "", {}, "sha512-stoXSIDBnqJhquTf0fNNoEfz2JfFCVXADoIim9c5QjWB7CoK3353ZtnJSydPNfzTLoeYuV5/0QNuSz34nSRSag=="], @@ -1588,7 +1589,7 @@ "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], - "body-parser": ["body-parser@2.2.1", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw=="], + "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], "bowser": ["bowser@2.13.1", "", {}, "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw=="], @@ -1612,7 +1613,7 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "caniuse-lite": ["caniuse-lite@1.0.30001762", "", {}, "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001763", "", {}, "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ=="], "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], @@ -1658,6 +1659,8 @@ "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], + "content-scraper": ["content-scraper@workspace:content-scraper"], + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], @@ -1874,7 +1877,7 @@ "iceberg-js": ["iceberg-js@0.8.1", "", {}, "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA=="], - "iconv-lite": ["iconv-lite@0.7.1", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw=="], + "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], @@ -1998,8 +2001,6 @@ "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - "mcp-content-scraper": ["mcp-content-scraper@workspace:content-scraper"], - "mcp-studio": ["mcp-studio@workspace:mcp-studio"], "mcp-template-minimal": ["mcp-template-minimal@workspace:template-minimal"], @@ -2026,7 +2027,7 @@ "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - "miniflare": ["miniflare@4.20251210.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20251210.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-k6kIoXwGVqlPZb0hcn+X7BmnK+8BjIIkusQPY22kCo2RaQJ/LzAjtxHQdGXerlHSnJyQivDQsL6BJHMpQfUFyw=="], + "miniflare": ["miniflare@4.20260107.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20260107.1", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "^3.25.76" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-X93sXczqbBq9ixoM6jnesmdTqp+4baVC/aM/DuPpRS0LK0XtcqaO75qPzNEvDEzBAHxwMAWRIum/9hg32YB8iA=="], "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -2420,9 +2421,9 @@ "whisper": ["whisper@workspace:whisper"], - "workerd": ["workerd@1.20251210.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251210.0", "@cloudflare/workerd-darwin-arm64": "1.20251210.0", "@cloudflare/workerd-linux-64": "1.20251210.0", "@cloudflare/workerd-linux-arm64": "1.20251210.0", "@cloudflare/workerd-windows-64": "1.20251210.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-9MUUneP1BnRE9XAYi94FXxHmiLGbO75EHQZsgWqSiOXjoXSqJCw8aQbIEPxCy19TclEl/kHUFYce8ST2W+Qpjw=="], + "workerd": ["workerd@1.20260107.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260107.1", "@cloudflare/workerd-darwin-arm64": "1.20260107.1", "@cloudflare/workerd-linux-64": "1.20260107.1", "@cloudflare/workerd-linux-arm64": "1.20260107.1", "@cloudflare/workerd-windows-64": "1.20260107.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-4ylAQJDdJZdMAUl2SbJgTa77YHpa88l6qmhiuCLNactP933+rifs7I0w1DslhUIFgydArUX5dNLAZnZhT7Bh7g=="], - "wrangler": ["wrangler@4.54.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.1", "@cloudflare/unenv-preset": "2.7.13", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20251210.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20251210.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20251210.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-bANFsjDwJLbprYoBK+hUDZsVbUv2SqJd8QvArLIcZk+fPq4h/Ohtj5vkKXD3k0s2bD1DXLk08D+hYmeNH+xC6A=="], + "wrangler": ["wrangler@4.58.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.1", "@cloudflare/unenv-preset": "2.8.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20260107.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260107.1" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260107.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-Jm6EYtlt8iUcznOCPSMYC54DYkwrMNESzbH0Vh3GFHv/7XVw5gBC13YJAB+nWMRGJ+6B2dMzy/NVQS4ONL51Pw=="], "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], @@ -2514,7 +2515,7 @@ "@deco-cx/warp-node/undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], - "@deco/mcp/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "@deco/mcp/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "@deco/mcp/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -2740,6 +2741,8 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@types/serve-static/@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], + "ai-v5/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.12", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@vercel/oidc": "3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W+cB1sOWvPcz9qiIsNtD+HxUrBUva2vWv2K1EFukuImX+HA0uZx3EyyOjhYQ9gtf/teqEG80M6OvJ7xx/VLV2A=="], "ai-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], @@ -2762,6 +2765,10 @@ "concurrently/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "content-scraper/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + + "content-scraper/deco-cli": ["deco-cli@0.26.0", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "^1.19.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "ws": "^8.16.0", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-fkYKYO81cK3NE4hb3zcPdMksKJiYM2mon0lKGBuvEOruVUfbhK0I7V777NZDrmaxVQXxDx0fa9i6fARjxT7muQ=="], + "data-for-seo/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], "data-for-seo/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -2792,12 +2799,8 @@ "gemini-pro-vision/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "google-calendar/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], - "google-calendar/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "google-tag-manager/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], - "google-tag-manager/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "inquirer-search-checkbox/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], @@ -2810,13 +2813,7 @@ "log-symbols/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "mcp-content-scraper/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - - "mcp-content-scraper/deco-cli": ["deco-cli@0.26.0", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "^1.19.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "ws": "^8.16.0", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-fkYKYO81cK3NE4hb3zcPdMksKJiYM2mon0lKGBuvEOruVUfbhK0I7V777NZDrmaxVQXxDx0fa9i6fARjxT7muQ=="], - - "mcp-studio/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], - - "mcp-studio/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "mcp-studio/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "mcp-template-minimal/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], @@ -2828,15 +2825,13 @@ "mcp-template-with-view/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "meta-ads/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], - "meta-ads/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - "miniflare/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + "miniflare/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "nanobanana/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], @@ -2852,7 +2847,7 @@ "ora/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "path-scurry/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "perplexity/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], @@ -2872,14 +2867,12 @@ "reddit/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], - "reddit/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "reddit/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "reddit/deco-cli": ["deco-cli@0.26.0", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "^1.19.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "ws": "^8.16.0", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-fkYKYO81cK3NE4hb3zcPdMksKJiYM2mon0lKGBuvEOruVUfbhK0I7V777NZDrmaxVQXxDx0fa9i6fARjxT7muQ=="], "reddit/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "registry/@decocms/runtime": ["@decocms/runtime@1.1.0", "", { "dependencies": { "@ai-sdk/provider": "^2.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "1.0.3", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-+kacx94Oj1zNetWkg6aRDdAUaAIqXufP1T6j6JqnDRjRCpZeSkW8GU1Sp2mfCw4KDo/XbeB5jPzFKSHfUKH8JQ=="], - "registry/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "registry/@types/node": ["@types/node@22.19.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], @@ -3052,19 +3045,25 @@ "apify/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "apify/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "apify/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "cloudflare/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], "concurrently/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "content-scraper/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "content-scraper/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], + + "content-scraper/deco-cli/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "data-for-seo/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "datajud/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "datajud/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "datajud/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "deco-cli/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -3082,18 +3081,10 @@ "gemini-pro-vision/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - - "google-calendar/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "google-calendar/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], + "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "google-calendar/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "google-tag-manager/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "google-tag-manager/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], - "google-tag-manager/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "inquirer-search-checkbox/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], @@ -3138,39 +3129,25 @@ "log-symbols/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "mcp-content-scraper/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], - - "mcp-content-scraper/deco-cli/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "mcp-studio/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "mcp-studio/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], - "mcp-studio/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "mcp-template-minimal/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "mcp-template-with-view/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - - "meta-ads/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "meta-ads/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], + "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "meta-ads/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "nanobanana/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "object-storage/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "object-storage/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "object-storage/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "openrouter/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -3178,15 +3155,15 @@ "perplexity/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "perplexity/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "perplexity/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "pinecone/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "pinecone/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "pinecone/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "readonly-sql/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "reddit/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], @@ -3196,29 +3173,25 @@ "reddit/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], - "registry/@decocms/runtime/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "registry/@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.3", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5" } }, "sha512-0qGrAcH74Td9Ruhx7SI31o9mvKlMeQGtiRf5BzDcSgG0cvgJhaMMSvz72tvbUVl77GLu93v02NlKupui8yeiMw=="], - "registry/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "registry/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "replicate/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "replicate/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "replicate/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "sora/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "sora/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "sora/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "veo/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "veo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "veo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "whisper/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "whisper/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "whisper/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="], @@ -3334,6 +3307,18 @@ "apify/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "content-scraper/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/auth-js": ["@supabase/auth-js@2.70.0", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/functions-js": ["@supabase/functions-js@2.4.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/postgrest-js": ["@supabase/postgrest-js@1.19.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js": ["@supabase/realtime-js@2.11.10", "", { "dependencies": { "@supabase/node-fetch": "^2.6.13", "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "ws": "^8.18.2" } }, "sha512-SJKVa7EejnuyfImrbzx+HaD9i6T784khuw1zP+MBD7BmJYChegGxYigPzkKX8CK8nGuDntmeSD3fvriaH0EGZA=="], + + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/storage-js": ["@supabase/storage-js@2.7.1", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA=="], + "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3422,12 +3407,8 @@ "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "google-calendar/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "google-calendar/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "google-tag-manager/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "google-tag-manager/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "inquirer-search-checkbox/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], @@ -3450,20 +3431,6 @@ "inquirer-search-list/inquirer/strip-ansi/ansi-regex": ["ansi-regex@3.0.1", "", {}, "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="], - "mcp-content-scraper/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/auth-js": ["@supabase/auth-js@2.70.0", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/functions-js": ["@supabase/functions-js@2.4.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/postgrest-js": ["@supabase/postgrest-js@1.19.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js": ["@supabase/realtime-js@2.11.10", "", { "dependencies": { "@supabase/node-fetch": "^2.6.13", "@types/phoenix": "^1.6.6", "@types/ws": "^8.18.1", "ws": "^8.18.2" } }, "sha512-SJKVa7EejnuyfImrbzx+HaD9i6T784khuw1zP+MBD7BmJYChegGxYigPzkKX8CK8nGuDntmeSD3fvriaH0EGZA=="], - - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/storage-js": ["@supabase/storage-js@2.7.1", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA=="], - - "mcp-studio/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "mcp-studio/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "mcp-template-minimal/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], @@ -3522,8 +3489,6 @@ "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "meta-ads/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "meta-ads/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "nanobanana/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], @@ -3704,8 +3669,6 @@ "reddit/deco-cli/@supabase/supabase-js/@supabase/storage-js": ["@supabase/storage-js@2.7.1", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA=="], - "registry/@decocms/runtime/@decocms/bindings/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "registry/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], @@ -3856,6 +3819,8 @@ "apify/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -3976,8 +3941,6 @@ "inquirer-search-list/inquirer/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "mcp-content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - "mcp-template-minimal/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "mcp-template-minimal/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], diff --git a/content-scraper/package.json b/content-scraper/package.json index b88de3b6..408ba7c1 100644 --- a/content-scraper/package.json +++ b/content-scraper/package.json @@ -14,7 +14,7 @@ "build": "bun run build:server" }, "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "@supabase/supabase-js": "^2.49.0", "zod": "^4.0.0" }, diff --git a/google-calendar/package.json b/google-calendar/package.json index 92817c02..59330cfd 100644 --- a/google-calendar/package.json +++ b/google-calendar/package.json @@ -12,7 +12,7 @@ "check": "tsc --noEmit" }, "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "zod": "^4.0.0" }, "devDependencies": { diff --git a/google-tag-manager/package.json b/google-tag-manager/package.json index 8a13cdf1..54052b06 100644 --- a/google-tag-manager/package.json +++ b/google-tag-manager/package.json @@ -12,7 +12,7 @@ "check": "tsc --noEmit" }, "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "zod": "^4.0.0" }, "devDependencies": { diff --git a/mcp-studio/package.json b/mcp-studio/package.json index fe79fbc5..8c8aa5a7 100644 --- a/mcp-studio/package.json +++ b/mcp-studio/package.json @@ -16,7 +16,7 @@ "dependencies": { "@ai-sdk/mcp": "^1.0.1", "@decocms/bindings": "^1.0.7", - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "@jitl/quickjs-singlefile-cjs-release-sync": "^0.31.0", "@modelcontextprotocol/sdk": "^1.25.1", "@radix-ui/react-collapsible": "^1.1.12", diff --git a/meta-ads/package.json b/meta-ads/package.json index b70dcdb5..30410a46 100644 --- a/meta-ads/package.json +++ b/meta-ads/package.json @@ -13,7 +13,7 @@ "dev:tunnel": "deco link -p 3003 -- PORT=3003 bun run dev" }, "dependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "zod": "^4.0.0" }, "devDependencies": { diff --git a/openrouter/package.json b/openrouter/package.json index f48aac40..7a9bfba3 100644 --- a/openrouter/package.json +++ b/openrouter/package.json @@ -14,8 +14,8 @@ "dependencies": { "@ai-sdk/provider": "^3.0.2", "@ai-sdk/provider-utils": "^4.0.4", - "@decocms/bindings": "^1.0.6", - "@decocms/runtime": "^1.1.1", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.2", "@openrouter/ai-sdk-provider": "^1.5.4", "@openrouter/sdk": "^0.3.11", "ai": "^6.0.3", diff --git a/registry/package.json b/registry/package.json index d77cbba9..1dd9f516 100644 --- a/registry/package.json +++ b/registry/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@decocms/bindings": "^1.0.4", - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "@supabase/supabase-js": "^2.89.0", "zod": "^4.0.0" }, diff --git a/shared/package.json b/shared/package.json index d677528a..eafa41a1 100644 --- a/shared/package.json +++ b/shared/package.json @@ -20,7 +20,7 @@ "./serve": "./serve.ts" }, "devDependencies": { - "@decocms/runtime": "^1.1.0", + "@decocms/runtime": "^1.1.2", "@types/bun": "^1.2.14", "vite": "7.2.0", "zod": "^4.0.0" From cfd2c41a1e839cdf3b87bb4a4c42a926dfe3fecb Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 18:35:09 -0300 Subject: [PATCH 03/31] feat(google-big-query): Add new BigQuery MCP with OAuth PKCE - Migrate from old Cloudflare Workers structure to new Bun runtime - Implement Google OAuth PKCE flow (based on google-calendar pattern) - Add BigQueryClient class with full API support - Create 4 tools: query, list_datasets, list_tables, get_table_schema - Use @decocms/runtime and createPrivateTool pattern - Add proper TypeScript types for all BigQuery API responses --- bun.lock | 16 + google-big-query/.gitignore | 5 + google-big-query/app.json | 13 + google-big-query/package.json | 28 ++ google-big-query/server/constants.ts | 47 +++ .../server/lib/bigquery-client.ts | 271 ++++++++++++++ google-big-query/server/lib/env.ts | 17 + google-big-query/server/lib/types.ts | 199 ++++++++++ google-big-query/server/main.ts | 123 ++++++ google-big-query/server/tools/bigquery.ts | 353 ++++++++++++++++++ google-big-query/server/tools/index.ts | 20 + google-big-query/shared/deco.gen.ts | 63 ++++ google-big-query/tsconfig.json | 36 ++ package.json | 1 + 14 files changed, 1192 insertions(+) create mode 100644 google-big-query/.gitignore create mode 100644 google-big-query/app.json create mode 100644 google-big-query/package.json create mode 100644 google-big-query/server/constants.ts create mode 100644 google-big-query/server/lib/bigquery-client.ts create mode 100644 google-big-query/server/lib/env.ts create mode 100644 google-big-query/server/lib/types.ts create mode 100644 google-big-query/server/main.ts create mode 100644 google-big-query/server/tools/bigquery.ts create mode 100644 google-big-query/server/tools/index.ts create mode 100644 google-big-query/shared/deco.gen.ts create mode 100644 google-big-query/tsconfig.json diff --git a/bun.lock b/bun.lock index eb060969..76c44409 100644 --- a/bun.lock +++ b/bun.lock @@ -115,6 +115,20 @@ "wrangler": "^4.28.0", }, }, + "google-big-query": { + "name": "google-big-query", + "version": "1.0.0", + "dependencies": { + "@decocms/runtime": "^1.1.0", + "zod": "^4.0.0", + }, + "devDependencies": { + "@decocms/mcps-shared": "workspace:*", + "@modelcontextprotocol/sdk": "1.25.1", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2", + }, + }, "google-calendar": { "name": "google-calendar", "version": "1.0.0", @@ -1845,6 +1859,8 @@ "goober": ["goober@2.1.18", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw=="], + "google-big-query": ["google-big-query@workspace:google-big-query"], + "google-calendar": ["google-calendar@workspace:google-calendar"], "google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], diff --git a/google-big-query/.gitignore b/google-big-query/.gitignore new file mode 100644 index 00000000..11a5dce6 --- /dev/null +++ b/google-big-query/.gitignore @@ -0,0 +1,5 @@ +dist/ +node_modules/ +.env +.dev.vars + diff --git a/google-big-query/app.json b/google-big-query/app.json new file mode 100644 index 00000000..1be0887c --- /dev/null +++ b/google-big-query/app.json @@ -0,0 +1,13 @@ +{ + "scopeName": "deco", + "name": "google-big-query", + "friendlyName": "Google BigQuery", + "connection": { + "type": "HTTP", + "url": "https://sites-google-big-query.decocache.com/mcp" + }, + "description": "Query and manage Google BigQuery datasets. Execute SQL queries, list datasets and tables, and explore table schemas.", + "icon": "https://cdn.worldvectorlogo.com/logos/google-bigquery-logo-1.svg", + "unlisted": false +} + diff --git a/google-big-query/package.json b/google-big-query/package.json new file mode 100644 index 00000000..bdae7cb9 --- /dev/null +++ b/google-big-query/package.json @@ -0,0 +1,28 @@ +{ + "name": "google-big-query", + "version": "1.0.0", + "description": "Google BigQuery MCP Server - Query and manage BigQuery datasets", + "private": true, + "type": "module", + "scripts": { + "dev": "bun run --hot server/main.ts", + "build:server": "NODE_ENV=production bun build server/main.ts --target=bun --outfile=dist/server/main.js", + "build": "bun run build:server", + "publish": "cat app.json | deco registry publish -w /shared/deco -y", + "check": "tsc --noEmit" + }, + "dependencies": { + "@decocms/runtime": "^1.1.0", + "zod": "^4.0.0" + }, + "devDependencies": { + "@decocms/mcps-shared": "workspace:*", + "@modelcontextprotocol/sdk": "1.25.1", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2" + }, + "engines": { + "node": ">=22.0.0" + } +} + diff --git a/google-big-query/server/constants.ts b/google-big-query/server/constants.ts new file mode 100644 index 00000000..24d90a82 --- /dev/null +++ b/google-big-query/server/constants.ts @@ -0,0 +1,47 @@ +/** + * BigQuery API Constants + */ + +export const BIGQUERY_API_BASE = "https://bigquery.googleapis.com/bigquery/v2"; + +/** + * BigQuery API Endpoints + */ +export const ENDPOINTS = { + // Datasets + DATASETS: (projectId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/datasets`, + DATASET: (projectId: string, datasetId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/datasets/${datasetId}`, + + // Tables + TABLES: (projectId: string, datasetId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/datasets/${datasetId}/tables`, + TABLE: (projectId: string, datasetId: string, tableId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/datasets/${datasetId}/tables/${tableId}`, + + // Query + QUERY: (projectId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/queries`, + QUERY_RESULTS: (projectId: string, jobId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/queries/${jobId}`, + + // Jobs + JOBS: (projectId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/jobs`, + JOB: (projectId: string, jobId: string) => + `${BIGQUERY_API_BASE}/projects/${projectId}/jobs/${jobId}`, + + // Projects + PROJECTS: `${BIGQUERY_API_BASE}/projects`, +} as const; + +/** + * Default configuration values + */ +export const DEFAULTS = { + MAX_RESULTS: 1000, + QUERY_TIMEOUT_MS: 60000, + USE_LEGACY_SQL: false, + USE_QUERY_CACHE: true, +} as const; diff --git a/google-big-query/server/lib/bigquery-client.ts b/google-big-query/server/lib/bigquery-client.ts new file mode 100644 index 00000000..c0612faa --- /dev/null +++ b/google-big-query/server/lib/bigquery-client.ts @@ -0,0 +1,271 @@ +/** + * BigQuery API client + * Handles all communication with the Google BigQuery API + */ + +import { ENDPOINTS, DEFAULTS } from "../constants.ts"; +import type { + DatasetsListResponse, + Dataset, + TablesListResponse, + Table, + QueryRequest, + QueryResponse, + GetQueryResultsResponse, + TableSchema, + TableRow, +} from "./types.ts"; + +export interface BigQueryClientConfig { + accessToken: string; +} + +export class BigQueryClient { + private accessToken: string; + + constructor(config: BigQueryClientConfig) { + this.accessToken = config.accessToken; + } + + /** + * Make a request to the BigQuery API + */ + private async request(url: string, options: RequestInit = {}): Promise { + const response = await fetch(url, { + ...options, + headers: { + Authorization: `Bearer ${this.accessToken}`, + "Content-Type": "application/json", + ...options.headers, + }, + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`BigQuery API error: ${response.status} - ${error}`); + } + + // Handle 204 No Content + if (response.status === 204) { + return {} as T; + } + + return (await response.json()) as T; + } + + // ==================== Dataset Methods ==================== + + /** + * List all datasets in a project + */ + async listDatasets( + projectId: string, + options?: { + maxResults?: number; + pageToken?: string; + all?: boolean; + }, + ): Promise { + const url = new URL(ENDPOINTS.DATASETS(projectId)); + + if (options?.maxResults) { + url.searchParams.set("maxResults", String(options.maxResults)); + } + if (options?.pageToken) { + url.searchParams.set("pageToken", options.pageToken); + } + if (options?.all) { + url.searchParams.set("all", "true"); + } + + return this.request(url.toString()); + } + + /** + * Get a specific dataset + */ + async getDataset(projectId: string, datasetId: string): Promise { + return this.request(ENDPOINTS.DATASET(projectId, datasetId)); + } + + // ==================== Table Methods ==================== + + /** + * List all tables in a dataset + */ + async listTables( + projectId: string, + datasetId: string, + options?: { + maxResults?: number; + pageToken?: string; + }, + ): Promise { + const url = new URL(ENDPOINTS.TABLES(projectId, datasetId)); + + if (options?.maxResults) { + url.searchParams.set("maxResults", String(options.maxResults)); + } + if (options?.pageToken) { + url.searchParams.set("pageToken", options.pageToken); + } + + return this.request(url.toString()); + } + + /** + * Get a specific table with its schema + */ + async getTable( + projectId: string, + datasetId: string, + tableId: string, + ): Promise { + return this.request
(ENDPOINTS.TABLE(projectId, datasetId, tableId)); + } + + /** + * Get table schema only + */ + async getTableSchema( + projectId: string, + datasetId: string, + tableId: string, + ): Promise { + const table = await this.getTable(projectId, datasetId, tableId); + return table.schema || { fields: [] }; + } + + // ==================== Query Methods ==================== + + /** + * Execute a SQL query + */ + async query( + projectId: string, + options: { + query: string; + useLegacySql?: boolean; + maxResults?: number; + timeoutMs?: number; + dryRun?: boolean; + useQueryCache?: boolean; + defaultDataset?: { + projectId: string; + datasetId: string; + }; + }, + ): Promise { + const queryRequest: QueryRequest = { + query: options.query, + useLegacySql: options.useLegacySql ?? DEFAULTS.USE_LEGACY_SQL, + maxResults: options.maxResults ?? DEFAULTS.MAX_RESULTS, + timeoutMs: options.timeoutMs ?? DEFAULTS.QUERY_TIMEOUT_MS, + dryRun: options.dryRun ?? false, + useQueryCache: options.useQueryCache ?? DEFAULTS.USE_QUERY_CACHE, + }; + + if (options.defaultDataset) { + queryRequest.defaultDataset = options.defaultDataset; + } + + return this.request(ENDPOINTS.QUERY(projectId), { + method: "POST", + body: JSON.stringify(queryRequest), + }); + } + + /** + * Get query results (for long-running queries) + */ + async getQueryResults( + projectId: string, + jobId: string, + options?: { + maxResults?: number; + pageToken?: string; + startIndex?: string; + timeoutMs?: number; + }, + ): Promise { + const url = new URL(ENDPOINTS.QUERY_RESULTS(projectId, jobId)); + + if (options?.maxResults) { + url.searchParams.set("maxResults", String(options.maxResults)); + } + if (options?.pageToken) { + url.searchParams.set("pageToken", options.pageToken); + } + if (options?.startIndex) { + url.searchParams.set("startIndex", options.startIndex); + } + if (options?.timeoutMs) { + url.searchParams.set("timeoutMs", String(options.timeoutMs)); + } + + return this.request(url.toString()); + } + + /** + * Execute query and wait for complete results + * Handles pagination and job completion automatically + */ + async queryAndWait( + projectId: string, + options: { + query: string; + useLegacySql?: boolean; + maxResults?: number; + timeoutMs?: number; + useQueryCache?: boolean; + defaultDataset?: { + projectId: string; + datasetId: string; + }; + }, + ): Promise<{ + schema: TableSchema; + rows: TableRow[]; + totalRows: string; + cacheHit: boolean; + totalBytesProcessed: string; + }> { + // Initial query + let response = await this.query(projectId, options); + + // Wait for job completion if not complete + while (!response.jobComplete && response.jobReference) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + const results = await this.getQueryResults( + projectId, + response.jobReference.jobId, + { + timeoutMs: options.timeoutMs ?? DEFAULTS.QUERY_TIMEOUT_MS, + }, + ); + response = { + ...response, + ...results, + jobComplete: results.jobComplete, + }; + } + + // Check for errors + if (response.errors && response.errors.length > 0) { + throw new Error( + `Query error: ${response.errors.map((e) => e.message).join(", ")}`, + ); + } + + return { + schema: response.schema || { fields: [] }, + rows: response.rows || [], + totalRows: response.totalRows || "0", + cacheHit: response.cacheHit || false, + totalBytesProcessed: response.totalBytesProcessed || "0", + }; + } +} + +// Re-export getGoogleAccessToken from env.ts for convenience +export { getGoogleAccessToken as getAccessToken } from "./env.ts"; diff --git a/google-big-query/server/lib/env.ts b/google-big-query/server/lib/env.ts new file mode 100644 index 00000000..0e44436a --- /dev/null +++ b/google-big-query/server/lib/env.ts @@ -0,0 +1,17 @@ +import type { Env } from "../../shared/deco.gen.ts"; + +/** + * Get Google OAuth access token from environment context + * @param env - The environment containing the mesh request context + * @returns The OAuth access token + * @throws Error if not authenticated + */ +export const getGoogleAccessToken = (env: Env): string => { + const authorization = env.MESH_REQUEST_CONTEXT?.authorization; + if (!authorization) { + throw new Error( + "Not authenticated. Please authorize with Google BigQuery first.", + ); + } + return authorization; +}; diff --git a/google-big-query/server/lib/types.ts b/google-big-query/server/lib/types.ts new file mode 100644 index 00000000..7c4c3855 --- /dev/null +++ b/google-big-query/server/lib/types.ts @@ -0,0 +1,199 @@ +/** + * BigQuery API Types + */ + +// ==================== Dataset Types ==================== + +export interface Dataset { + kind: string; + id: string; + datasetReference: DatasetReference; + friendlyName?: string; + description?: string; + location?: string; + creationTime?: string; + lastModifiedTime?: string; +} + +export interface DatasetReference { + projectId: string; + datasetId: string; +} + +export interface DatasetsListResponse { + kind: string; + etag?: string; + nextPageToken?: string; + datasets?: Dataset[]; +} + +// ==================== Table Types ==================== + +export interface Table { + kind: string; + id: string; + tableReference: TableReference; + friendlyName?: string; + description?: string; + type?: string; + creationTime?: string; + expirationTime?: string; + numBytes?: string; + numRows?: string; + schema?: TableSchema; +} + +export interface TableReference { + projectId: string; + datasetId: string; + tableId: string; +} + +export interface TableSchema { + fields?: TableFieldSchema[]; +} + +export interface TableFieldSchema { + name: string; + type: string; + mode?: string; + description?: string; + fields?: TableFieldSchema[]; +} + +export interface TablesListResponse { + kind: string; + etag?: string; + nextPageToken?: string; + tables?: Table[]; + totalItems?: number; +} + +// ==================== Query Types ==================== + +export interface QueryRequest { + query: string; + useLegacySql?: boolean; + maxResults?: number; + timeoutMs?: number; + dryRun?: boolean; + useQueryCache?: boolean; + defaultDataset?: DatasetReference; + parameterMode?: string; + queryParameters?: QueryParameter[]; +} + +export interface QueryParameter { + name?: string; + parameterType: QueryParameterType; + parameterValue: QueryParameterValue; +} + +export interface QueryParameterType { + type: string; + arrayType?: QueryParameterType; + structTypes?: Array<{ + name?: string; + type: QueryParameterType; + }>; +} + +export interface QueryParameterValue { + value?: string; + arrayValues?: QueryParameterValue[]; + structValues?: Record; +} + +export interface QueryResponse { + kind: string; + schema?: TableSchema; + jobReference?: JobReference; + totalRows?: string; + pageToken?: string; + rows?: TableRow[]; + totalBytesProcessed?: string; + jobComplete?: boolean; + errors?: ErrorProto[]; + cacheHit?: boolean; + numDmlAffectedRows?: string; +} + +export interface TableRow { + f?: TableCell[]; +} + +export interface TableCell { + v?: unknown; +} + +export interface JobReference { + projectId: string; + jobId: string; + location?: string; +} + +export interface ErrorProto { + reason?: string; + location?: string; + debugInfo?: string; + message?: string; +} + +// ==================== Job Types ==================== + +export interface Job { + kind: string; + etag?: string; + id?: string; + selfLink?: string; + jobReference?: JobReference; + configuration?: JobConfiguration; + status?: JobStatus; + statistics?: JobStatistics; +} + +export interface JobConfiguration { + query?: JobConfigurationQuery; + jobType?: string; +} + +export interface JobConfigurationQuery { + query: string; + destinationTable?: TableReference; + useLegacySql?: boolean; +} + +export interface JobStatus { + state?: string; + errorResult?: ErrorProto; + errors?: ErrorProto[]; +} + +export interface JobStatistics { + creationTime?: string; + startTime?: string; + endTime?: string; + totalBytesProcessed?: string; + query?: JobStatisticsQuery; +} + +export interface JobStatisticsQuery { + totalBytesProcessed?: string; + totalBytesBilled?: string; + cacheHit?: boolean; + statementType?: string; +} + +export interface GetQueryResultsResponse { + kind: string; + etag?: string; + schema?: TableSchema; + jobReference?: JobReference; + totalRows?: string; + pageToken?: string; + rows?: TableRow[]; + totalBytesProcessed?: string; + jobComplete?: boolean; + errors?: ErrorProto[]; + cacheHit?: boolean; +} diff --git a/google-big-query/server/main.ts b/google-big-query/server/main.ts new file mode 100644 index 00000000..c8b0ad8a --- /dev/null +++ b/google-big-query/server/main.ts @@ -0,0 +1,123 @@ +/** + * Google BigQuery MCP Server + * + * This MCP provides tools for interacting with Google BigQuery API, + * including querying datasets, listing tables, and exploring schemas. + */ +import { withRuntime } from "@decocms/runtime"; +import { serve } from "@decocms/mcps-shared/serve"; + +import { tools } from "./tools/index.ts"; +import type { Env } from "../shared/deco.gen.ts"; + +export type { Env }; + +const BIGQUERY_SCOPES = [ + "https://www.googleapis.com/auth/bigquery", + "https://www.googleapis.com/auth/bigquery.readonly", +].join(" "); + +// Store the last used redirect_uri for token exchange +let lastRedirectUri: string | null = null; + +const runtime = withRuntime({ + tools: (env: Env) => tools.map((createTool) => createTool(env)), + oauth: { + mode: "PKCE", + // Used in protected resource metadata to point to the auth server + authorizationServer: "https://accounts.google.com", + + // Generates the URL to redirect users to for authorization + authorizationUrl: (callbackUrl) => { + // Parse the callback URL to extract base URL and state parameter + // Google OAuth doesn't allow 'state' inside redirect_uri + const callbackUrlObj = new URL(callbackUrl); + const state = callbackUrlObj.searchParams.get("state"); + + // Remove state from redirect_uri (Google requires clean redirect_uri) + callbackUrlObj.searchParams.delete("state"); + const cleanRedirectUri = callbackUrlObj.toString(); + + // Store for later use in exchangeCode + lastRedirectUri = cleanRedirectUri; + + const url = new URL("https://accounts.google.com/o/oauth2/v2/auth"); + url.searchParams.set("redirect_uri", cleanRedirectUri); + url.searchParams.set("client_id", process.env.GOOGLE_CLIENT_ID!); + url.searchParams.set("response_type", "code"); + url.searchParams.set("scope", BIGQUERY_SCOPES); + url.searchParams.set("access_type", "offline"); + url.searchParams.set("prompt", "consent"); + + // Pass state as a separate OAuth parameter (Google will return it in the callback) + if (state) { + url.searchParams.set("state", state); + } + + return url.toString(); + }, + + // Exchanges the authorization code for access token + exchangeCode: async ({ + code, + code_verifier, + code_challenge_method, + }: { + code: string; + code_verifier?: string; + code_challenge_method?: string; + }) => { + // Use the stored redirect_uri from authorizationUrl + const cleanRedirectUri = lastRedirectUri; + + if (!cleanRedirectUri) { + throw new Error( + "redirect_uri is required for Google OAuth token exchange", + ); + } + + const params = new URLSearchParams({ + code, + client_id: process.env.GOOGLE_CLIENT_ID!, + client_secret: process.env.GOOGLE_CLIENT_SECRET!, + grant_type: "authorization_code", + redirect_uri: cleanRedirectUri, + }); + + // Add PKCE verifier if provided + if (code_verifier) { + params.set("code_verifier", code_verifier); + } + if (code_challenge_method) { + params.set("code_challenge_method", code_challenge_method); + } + + const response = await fetch("https://oauth2.googleapis.com/token", { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: params, + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`Google OAuth failed: ${response.status} - ${error}`); + } + + const data = (await response.json()) as { + access_token: string; + refresh_token?: string; + expires_in?: number; + token_type: string; + }; + + return { + access_token: data.access_token, + refresh_token: data.refresh_token, + token_type: data.token_type || "Bearer", + expires_in: data.expires_in, + }; + }, + }, +}); + +serve(runtime.fetch); diff --git a/google-big-query/server/tools/bigquery.ts b/google-big-query/server/tools/bigquery.ts new file mode 100644 index 00000000..2152cc16 --- /dev/null +++ b/google-big-query/server/tools/bigquery.ts @@ -0,0 +1,353 @@ +/** + * BigQuery Tools + * + * Tools for querying, listing datasets/tables, and exploring schemas + */ + +import { createPrivateTool } from "@decocms/runtime/tools"; +import { z } from "zod"; +import type { Env } from "../main.ts"; +import { BigQueryClient, getAccessToken } from "../lib/bigquery-client.ts"; + +// ============================================================================ +// Schema Definitions +// ============================================================================ + +const TableFieldSchemaZod: z.ZodType<{ + name: string; + type: string; + mode?: string; + description?: string; + fields?: unknown[]; +}> = z.object({ + name: z.string().describe("Field name"), + type: z + .string() + .describe( + "Field type (STRING, INTEGER, FLOAT, BOOLEAN, TIMESTAMP, RECORD, etc.)", + ), + mode: z + .string() + .optional() + .describe("Field mode (NULLABLE, REQUIRED, REPEATED)"), + description: z.string().optional().describe("Field description"), + fields: z + .array(z.lazy(() => TableFieldSchemaZod)) + .optional() + .describe("Nested fields for RECORD type"), +}); + +const DatasetSchema = z.object({ + id: z.string().describe("Full dataset ID (project:dataset)"), + datasetId: z.string().describe("Dataset ID"), + projectId: z.string().describe("Project ID"), + friendlyName: z.string().optional().describe("Dataset friendly name"), + description: z.string().optional().describe("Dataset description"), + location: z.string().optional().describe("Dataset location"), +}); + +const TableInfoSchema = z.object({ + id: z.string().describe("Full table ID (project:dataset.table)"), + tableId: z.string().describe("Table ID"), + datasetId: z.string().describe("Dataset ID"), + projectId: z.string().describe("Project ID"), + type: z + .string() + .optional() + .describe("Table type (TABLE, VIEW, MATERIALIZED_VIEW, etc.)"), + friendlyName: z.string().optional().describe("Table friendly name"), + description: z.string().optional().describe("Table description"), + numRows: z.string().optional().describe("Number of rows"), + numBytes: z.string().optional().describe("Size in bytes"), +}); + +// ============================================================================ +// Execute Query Tool +// ============================================================================ + +export const createQueryTool = (env: Env) => + createPrivateTool({ + id: "bigquery_query", + description: + "Execute a SQL query against Google BigQuery. Returns the query results with schema information. Supports standard SQL by default.", + inputSchema: z.object({ + projectId: z.string().describe("Google Cloud project ID"), + query: z.string().describe("SQL query to execute"), + useLegacySql: z + .boolean() + .optional() + .describe("Use legacy SQL syntax (default: false, uses standard SQL)"), + maxResults: z.coerce + .number() + .int() + .min(1) + .max(10000) + .optional() + .describe("Maximum number of rows to return (default: 1000)"), + timeoutMs: z.coerce + .number() + .int() + .optional() + .describe("Query timeout in milliseconds (default: 60000)"), + useQueryCache: z + .boolean() + .optional() + .describe("Whether to use query cache (default: true)"), + defaultDatasetId: z + .string() + .optional() + .describe("Default dataset for unqualified table names"), + }), + outputSchema: z.object({ + schema: z + .object({ + fields: z.array(TableFieldSchemaZod).optional(), + }) + .describe("Query result schema"), + rows: z + .array(z.record(z.string(), z.unknown())) + .describe("Query result rows as objects"), + totalRows: z.string().describe("Total number of rows in result"), + cacheHit: z.boolean().describe("Whether results came from cache"), + totalBytesProcessed: z + .string() + .describe("Total bytes processed by the query"), + }), + execute: async ({ context }) => { + const client = new BigQueryClient({ + accessToken: getAccessToken(env), + }); + + const result = await client.queryAndWait(context.projectId, { + query: context.query, + useLegacySql: context.useLegacySql, + maxResults: context.maxResults, + timeoutMs: context.timeoutMs, + useQueryCache: context.useQueryCache, + defaultDataset: context.defaultDatasetId + ? { + projectId: context.projectId, + datasetId: context.defaultDatasetId, + } + : undefined, + }); + + // Convert rows to objects using schema field names + const fieldNames = result.schema.fields?.map((f) => f.name) || []; + const rows = result.rows.map((row) => { + const obj: Record = {}; + row.f?.forEach((cell, index) => { + if (fieldNames[index]) { + obj[fieldNames[index]] = cell.v; + } + }); + return obj; + }); + + return { + schema: result.schema, + rows, + totalRows: result.totalRows, + cacheHit: result.cacheHit, + totalBytesProcessed: result.totalBytesProcessed, + }; + }, + }); + +// ============================================================================ +// List Datasets Tool +// ============================================================================ + +export const createListDatasetsTool = (env: Env) => + createPrivateTool({ + id: "bigquery_list_datasets", + description: + "List all datasets in a Google BigQuery project. Returns dataset IDs, names, and metadata.", + inputSchema: z.object({ + projectId: z.string().describe("Google Cloud project ID"), + maxResults: z.coerce + .number() + .int() + .min(1) + .max(1000) + .optional() + .describe("Maximum number of datasets to return"), + pageToken: z + .string() + .optional() + .describe("Token for fetching next page of results"), + all: z + .boolean() + .optional() + .describe("Whether to list all datasets, including hidden ones"), + }), + outputSchema: z.object({ + datasets: z.array(DatasetSchema).describe("List of datasets"), + nextPageToken: z + .string() + .optional() + .describe("Token for fetching next page"), + }), + execute: async ({ context }) => { + const client = new BigQueryClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.listDatasets(context.projectId, { + maxResults: context.maxResults, + pageToken: context.pageToken, + all: context.all, + }); + + const datasets = (response.datasets || []).map((ds) => ({ + id: ds.id, + datasetId: ds.datasetReference.datasetId, + projectId: ds.datasetReference.projectId, + friendlyName: ds.friendlyName, + description: ds.description, + location: ds.location, + })); + + return { + datasets, + nextPageToken: response.nextPageToken, + }; + }, + }); + +// ============================================================================ +// List Tables Tool +// ============================================================================ + +export const createListTablesTool = (env: Env) => + createPrivateTool({ + id: "bigquery_list_tables", + description: + "List all tables in a Google BigQuery dataset. Returns table IDs, types, and metadata.", + inputSchema: z.object({ + projectId: z.string().describe("Google Cloud project ID"), + datasetId: z.string().describe("Dataset ID"), + maxResults: z.coerce + .number() + .int() + .min(1) + .max(1000) + .optional() + .describe("Maximum number of tables to return"), + pageToken: z + .string() + .optional() + .describe("Token for fetching next page of results"), + }), + outputSchema: z.object({ + tables: z.array(TableInfoSchema).describe("List of tables"), + nextPageToken: z + .string() + .optional() + .describe("Token for fetching next page"), + totalItems: z.number().optional().describe("Total number of tables"), + }), + execute: async ({ context }) => { + const client = new BigQueryClient({ + accessToken: getAccessToken(env), + }); + + const response = await client.listTables( + context.projectId, + context.datasetId, + { + maxResults: context.maxResults, + pageToken: context.pageToken, + }, + ); + + const tables = (response.tables || []).map((t) => ({ + id: t.id, + tableId: t.tableReference.tableId, + datasetId: t.tableReference.datasetId, + projectId: t.tableReference.projectId, + type: t.type, + friendlyName: t.friendlyName, + description: t.description, + numRows: t.numRows, + numBytes: t.numBytes, + })); + + return { + tables, + nextPageToken: response.nextPageToken, + totalItems: response.totalItems, + }; + }, + }); + +// ============================================================================ +// Get Table Schema Tool +// ============================================================================ + +export const createGetTableSchemaTool = (env: Env) => + createPrivateTool({ + id: "bigquery_get_table_schema", + description: + "Get the schema of a specific BigQuery table. Returns all fields with their types, modes, and descriptions.", + inputSchema: z.object({ + projectId: z.string().describe("Google Cloud project ID"), + datasetId: z.string().describe("Dataset ID"), + tableId: z.string().describe("Table ID"), + }), + outputSchema: z.object({ + table: z.object({ + id: z.string().describe("Full table ID"), + tableId: z.string().describe("Table ID"), + datasetId: z.string().describe("Dataset ID"), + projectId: z.string().describe("Project ID"), + type: z.string().optional(), + friendlyName: z.string().optional(), + description: z.string().optional(), + numRows: z.string().optional(), + numBytes: z.string().optional(), + }), + schema: z + .object({ + fields: z.array(TableFieldSchemaZod).optional(), + }) + .describe("Table schema"), + }), + execute: async ({ context }) => { + const client = new BigQueryClient({ + accessToken: getAccessToken(env), + }); + + const table = await client.getTable( + context.projectId, + context.datasetId, + context.tableId, + ); + + return { + table: { + id: table.id, + tableId: table.tableReference.tableId, + datasetId: table.tableReference.datasetId, + projectId: table.tableReference.projectId, + type: table.type, + friendlyName: table.friendlyName, + description: table.description, + numRows: table.numRows, + numBytes: table.numBytes, + }, + schema: table.schema || { fields: [] }, + }; + }, + }); + +// ============================================================================ +// Export all BigQuery tools +// ============================================================================ + +export const bigqueryTools = [ + createQueryTool, + createListDatasetsTool, + createListTablesTool, + createGetTableSchemaTool, +]; diff --git a/google-big-query/server/tools/index.ts b/google-big-query/server/tools/index.ts new file mode 100644 index 00000000..96fe1e4d --- /dev/null +++ b/google-big-query/server/tools/index.ts @@ -0,0 +1,20 @@ +/** + * Central export point for all Google BigQuery tools + * + * This file aggregates all tools from different modules into a single + * export, making it easy to import all tools in main.ts. + * + * Tools: + * - bigquery_query: Execute SQL queries + * - bigquery_list_datasets: List datasets in a project + * - bigquery_list_tables: List tables in a dataset + * - bigquery_get_table_schema: Get table schema details + */ + +import { bigqueryTools } from "./bigquery.ts"; + +// Export all tools from all modules +export const tools = [ + // BigQuery tools + ...bigqueryTools, +]; diff --git a/google-big-query/shared/deco.gen.ts b/google-big-query/shared/deco.gen.ts new file mode 100644 index 00000000..72b32e5d --- /dev/null +++ b/google-big-query/shared/deco.gen.ts @@ -0,0 +1,63 @@ +// Generated types for Google BigQuery MCP + +import { z } from "zod"; + +/** + * Mesh request context injected by the Deco runtime + * Contains authentication and metadata for the current request + */ +export interface MeshRequestContext { + /** OAuth access token from Google */ + authorization?: string; + /** Internal state for OAuth flow */ + state?: string; + /** JWT token for the request */ + token?: string; + /** URL of the mesh server */ + meshUrl?: string; + /** Connection ID for this session */ + connectionId?: string; + /** Function to ensure user is authenticated */ + ensureAuthenticated?: () => Promise; +} + +/** + * Environment type for Google BigQuery MCP + * Extends process env with Deco runtime context + */ +export interface Env { + /** Google OAuth Client ID */ + GOOGLE_CLIENT_ID: string; + /** Google OAuth Client Secret */ + GOOGLE_CLIENT_SECRET: string; + /** Mesh request context injected by runtime */ + MESH_REQUEST_CONTEXT: MeshRequestContext; + /** Self-reference MCP (if needed) */ + SELF?: unknown; + /** Whether running locally */ + IS_LOCAL?: boolean; +} + +/** + * State schema for OAuth flow validation + */ +export const StateSchema = z.object({}); + +/** + * MCP type helper for typed tool definitions + */ +export type Mcp Promise>> = { + [K in keyof T]: (( + input: Parameters[0], + ) => Promise>>) & { + asTool: () => Promise<{ + inputSchema: z.ZodType[0]>; + outputSchema?: z.ZodType>>; + description: string; + id: string; + execute: ( + input: Parameters[0], + ) => Promise>>; + }>; + }; +}; diff --git a/google-big-query/tsconfig.json b/google-big-query/tsconfig.json new file mode 100644 index 00000000..a7e0e946 --- /dev/null +++ b/google-big-query/tsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2023", "ES2024", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "allowJs": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + + /* Path Aliases */ + "baseUrl": ".", + "paths": { + "server/*": ["./server/*"] + } + }, + "include": [ + "server" + ] +} + diff --git a/package.json b/package.json index c0c5e430..539d6872 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "gemini-pro-vision", "google-calendar", "google-tag-manager", + "google-big-query", "meta-ads", "nanobanana", "object-storage", From 55c6207c7630a9c8b9712c507bcd3faeb5dbb279 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 18:51:27 -0300 Subject: [PATCH 04/31] feat(bigquery-client): Add maxWaitMs option for query timeout handling --- google-big-query/server/lib/bigquery-client.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/google-big-query/server/lib/bigquery-client.ts b/google-big-query/server/lib/bigquery-client.ts index c0612faa..a1e669c2 100644 --- a/google-big-query/server/lib/bigquery-client.ts +++ b/google-big-query/server/lib/bigquery-client.ts @@ -222,6 +222,7 @@ export class BigQueryClient { projectId: string; datasetId: string; }; + maxWaitMs?: number; }, ): Promise<{ schema: TableSchema; @@ -234,8 +235,20 @@ export class BigQueryClient { let response = await this.query(projectId, options); // Wait for job completion if not complete + const maxWaitMs = options.maxWaitMs ?? 300000; // 5 minutes default + const pollIntervalMs = 1000; + const startTime = Date.now(); + while (!response.jobComplete && response.jobReference) { - await new Promise((resolve) => setTimeout(resolve, 1000)); + // Check if we've exceeded the maximum wait time + if (Date.now() - startTime > maxWaitMs) { + throw new Error( + `Query timeout: Job did not complete within ${maxWaitMs / 1000} seconds. ` + + `Job ID: ${response.jobReference.jobId}`, + ); + } + + await new Promise((resolve) => setTimeout(resolve, pollIntervalMs)); const results = await this.getQueryResults( projectId, response.jobReference.jobId, From a681e6ed175289c271ba12509c55a03a4f8995d9 Mon Sep 17 00:00:00 2001 From: gimenes Date: Thu, 8 Jan 2026 18:56:47 -0300 Subject: [PATCH 05/31] llm binding --- bun.lock | 18 +++-- openrouter/server/tools/llm-binding.ts | 99 +++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 8 deletions(-) diff --git a/bun.lock b/bun.lock index 76c44409..0330dce4 100644 --- a/bun.lock +++ b/bun.lock @@ -673,7 +673,7 @@ "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.965.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-Tcod25/BTupraQwtb+Q+GX8bmEZfxIFjjJ/AvkhUZsZlkPeVluzq1uu3Oeqf145DCdMjzLIN6vab5MrykbDP+g=="], - "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.2", "", {}, "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg=="], + "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.3", "", {}, "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw=="], "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], @@ -2531,6 +2531,8 @@ "@deco-cx/warp-node/undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], + "@deco-cx/warp-node/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "@deco/mcp/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "@deco/mcp/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -2815,6 +2817,8 @@ "gemini-pro-vision/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "google-big-query/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "google-calendar/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "google-tag-manager/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], @@ -3071,6 +3075,8 @@ "content-scraper/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], + "content-scraper/deco-cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "content-scraper/deco-cli/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "data-for-seo/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], @@ -3099,6 +3105,8 @@ "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "google-big-query/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "google-calendar/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "google-tag-manager/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -3189,6 +3197,8 @@ "reddit/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], + "reddit/deco-cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "registry/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "registry/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], @@ -3423,6 +3433,8 @@ "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "google-big-query/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "google-calendar/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "google-tag-manager/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], @@ -3835,8 +3847,6 @@ "apify/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4243,8 +4253,6 @@ "reddit/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "reddit/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], diff --git a/openrouter/server/tools/llm-binding.ts b/openrouter/server/tools/llm-binding.ts index 61c7d73e..1d9e4c19 100644 --- a/openrouter/server/tools/llm-binding.ts +++ b/openrouter/server/tools/llm-binding.ts @@ -46,14 +46,107 @@ const DEFAULT_LOGO = * Provider logo mapping - maps provider names to their logo URLs */ const PROVIDER_LOGOS: Record = { - openai: - "https://assets.decocache.com/webdraw/15dc381c-23b4-4f6b-9ceb-9690f77a7cf5/openai.svg", + "aion-labs": + "https://assets.decocache.com/decocms/6da18da8-0160-4b85-8bca-84eefffebe12/images-(6).png", + ai21: "https://assets.decocache.com/decocms/5d8388e9-027b-4b23-b816-90cee1cd28ad/images-(5).png", + alfredpros: + "https://assets.decocache.com/decocms/76eaa620-ce73-43d6-8817-272c1d498b53/images-(19).png", + alibaba: + "https://assets.decocache.com/decocms/4d113b13-5412-4d3b-96ec-3c2e7c1f7a5f/images-(8).png", + allenai: + "https://assets.decocache.com/decocms/21d6071a-e0da-4919-9f35-902b1d0b85b8/allen.png", + alpindale: + "https://assets.decocache.com/decocms/76eaa620-ce73-43d6-8817-272c1d498b53/images-(19).png", + amazon: + "https://assets.decocache.com/decocms/31e7b260-6cf0-4753-bb32-bd062b15c5f1/Amazon_icon.png", anthropic: - "https://assets.decocache.com/webdraw/6ae2b0e1-7b81-48f7-9707-998751698b6f/anthropic.svg", + "https://assets.decocache.com/decocms/4fa4f3ed-1bf3-4e5a-8d05-4f3787df5966/anthropic-icon-tdvkiqisswbrmtkiygb0ia.webp", + "anthracite-org": DEFAULT_LOGO, + "arcee-ai": + "https://assets.decocache.com/decocms/ee325839-6acc-48dc-8cf7-8bab74698015/126496414.png", + baidu: + "https://assets.decocache.com/decocms/cf4c19f1-39b5-499e-87b7-e16dc5da2b50/images-(9).png", + bytedance: + "https://assets.decocache.com/decocms/1c111a26-8e1d-4a48-9d3c-fe9fb728af06/images-(18).png", + "bytedance-seed": + "https://assets.decocache.com/decocms/1c111a26-8e1d-4a48-9d3c-fe9fb728af06/images-(18).png", + cognitivecomputations: DEFAULT_LOGO, + cohere: + "https://assets.decocache.com/decocms/c942091b-b3bf-4c46-af37-fc2c1086d9f7/cohere-color.png", + deepcogito: + "https://assets.decocache.com/decocms/4ee77a8f-a36a-4933-8cdf-d2e8676b88d8/images-(13).png", + deepseek: + "https://assets.decocache.com/decocms/3611e8ac-4cad-4b0e-a1f8-8f791288ce03/images-(1).png", + eleutherai: + "https://assets.decocache.com/decocms/76eaa620-ce73-43d6-8817-272c1d498b53/images-(19).png", + essentialai: + "https://assets.decocache.com/decocms/c5afc6de-1e41-457e-a6dd-91810d92541e/images-(1).jpeg", google: "https://assets.decocache.com/webdraw/17df85af-1578-42ef-ae07-4300de0d1723/gemini.svg", + gryphe: + "https://assets.decocache.com/decocms/a5503d3b-2056-47f2-a76c-611b7416bdc8/6798c7dccaaadd0a1318d66a_66f41d1fd146c3b0b9c76453_gryphe-logo.webp", + "ibm-granite": + "https://assets.decocache.com/decocms/2c50018d-6f70-472d-be30-65a5e8e249f0/images-(10).png", + inflection: DEFAULT_LOGO, + inception: + "https://assets.decocache.com/decocms/ff9822b8-a914-482b-bd7d-b0e46b9d5a56/images-(6).jpeg", + kwaipilot: + "https://assets.decocache.com/decocms/cd576e1d-1184-45ba-8162-cf2bd06d684f/images-(14).png", + liquid: DEFAULT_LOGO, + mancer: + "https://assets.decocache.com/decocms/79762356-a0c5-4546-b268-ad4a0b51db51/Screenshot-2026-01-08-at-18.49.42.png", + meituan: DEFAULT_LOGO, + "meta-llama": + "https://assets.decocache.com/decocms/56421cb3-488c-4cc3-83a5-16d9a303850e/images-(11).png", + microsoft: + "https://assets.decocache.com/decocms/0e352a51-4ea5-4f35-802e-fd82bf266683/images-(12).png", + minimax: + "https://assets.decocache.com/decocms/f362cc4f-7ccc-4317-afda-92e6f348fdfd/images-(2).png", + mistralai: + "https://assets.decocache.com/decocms/73ab9971-bbbc-40dc-99a3-5fddd9a0f340/images-(3).png", + morph: DEFAULT_LOGO, + moonshotai: + "https://assets.decocache.com/decocms/b8abfea7-e8b4-4b72-b653-fdf11c9e3b66/moonshot.png", + neversleep: DEFAULT_LOGO, + "nex-agi": + "https://assets.decocache.com/decocms/d2ada265-160d-4959-981d-e90210d71713/241570229.jpeg", + nousresearch: + "https://assets.decocache.com/decocms/496acb3d-9b5d-4759-b764-16c9ca7eb6b2/nousresearch.png", + nvidia: + "https://assets.decocache.com/decocms/ecca3238-fa79-4648-bb55-738f13a4293f/nvidia-7.svg", + opengvlab: + "https://assets.decocache.com/decocms/fb2d0c32-85f1-410a-87f4-9731dfafd248/images-(2).jpeg", + openai: + "https://assets.decocache.com/webdraw/15dc381c-23b4-4f6b-9ceb-9690f77a7cf5/openai.svg", + openrouter: + "https://assets.decocache.com/decocms/a75e4eb2-8c95-4cd3-a2f8-c49b21feab5e/openrouter.png", + perplexity: + "https://assets.decocache.com/decocms/3a134746-f370-4089-a3c9-fe545be0441c/images-(15).png", + "prime-intellect": DEFAULT_LOGO, + qwen: "https://assets.decocache.com/decocms/ab94208c-4439-4aec-a06c-c51747120e43/Qwen_logo.svg.png", + raifle: DEFAULT_LOGO, + relace: + "https://assets.decocache.com/decocms/c5dbae73-3ce0-40ca-8433-c38783fb13a9/Screenshot-2026-01-08-at-18.52.09.png", + sao10k: + "https://assets.decocache.com/decocms/76eaa620-ce73-43d6-8817-272c1d498b53/images-(19).png", + "stepfun-ai": + "https://assets.decocache.com/decocms/8892b883-4905-444e-b554-648565dc7fab/images-(16).png", + switchpoint: + "https://assets.decocache.com/decocms/0319d595-e0dd-4d8e-a0a3-b20ff4cbddcb/images-(4).jpeg", + tencent: + "https://assets.decocache.com/decocms/80f2f7bd-f9ea-4fcf-b89c-c58823a389ed/images-(3).jpeg", + thedrummer: + "https://assets.decocache.com/decocms/5c6c09fc-cf9d-43a1-a1c3-4a1ef367b824/images-(17).png", + thudm: DEFAULT_LOGO, + tngtech: + "https://assets.decocache.com/decocms/5b5648ad-f858-4687-b67b-212cf186b62d/images-(7).png", + undi95: DEFAULT_LOGO, + xiaomi: + "https://assets.decocache.com/decocms/2d7191b7-fc80-4867-a431-6d443d691cfc/images-(4).png", "x-ai": "https://assets.decocache.com/webdraw/7a8003ff-8f2d-4988-8693-3feb20e87eca/xai.svg", + "z-ai": + "https://assets.decocache.com/decocms/12a0877f-c978-4880-88d1-09097e606e2f/Z.ai_(company_logo).svg.png", }; // ============================================================================ From acb0974f1cd1c7fed766c09205736055539b183f Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 18:59:18 -0300 Subject: [PATCH 06/31] redeploy --- google-big-query/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-big-query/.gitignore b/google-big-query/.gitignore index 11a5dce6..e091e2b0 100644 --- a/google-big-query/.gitignore +++ b/google-big-query/.gitignore @@ -1,5 +1,5 @@ dist/ node_modules/ -.env +.env .dev.vars From 2be3350d80963158511a6a7108f986ebfdbbf4e2 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 19:44:16 -0300 Subject: [PATCH 07/31] refactor(app.json, README.md): Update app name and enhance documentation - Changed app name from "Grain mcp" to "grain-mcp" and added "Grain Official" as the frandryName. - Updated category to "Collaboration". - Translated README content from Portuguese to English for better accessibility. - Improved clarity and consistency in the documentation regarding usage and connection details. --- cloudflare-docs/README.md | 43 ++++++++++++++++++++++++ cloudflare-docs/app.json | 15 +++++++++ cloudflare-observability/README.md | 43 ++++++++++++++++++++++++ cloudflare-observability/app.json | 15 +++++++++ cloudflare-workers/README.md | 43 ++++++++++++++++++++++++ cloudflare-workers/app.json | 15 +++++++++ digitalocean-apps/README.md | 44 +++++++++++++++++++++++++ digitalocean-apps/app.json | 15 +++++++++ digitalocean-databases/README.md | 52 ++++++++++++++++++++++++++++++ digitalocean-databases/app.json | 15 +++++++++ exa-search/README.md | 43 ++++++++++++++++++++++++ exa-search/app.json | 15 +++++++++ github-mcp-server/README.md | 43 ++++++++++++++++++++++++ github-mcp-server/app.json | 15 +++++++++ google-bigquery-official/README.md | 43 ++++++++++++++++++++++++ google-bigquery-official/app.json | 15 +++++++++ google-gke-official/README.md | 43 ++++++++++++++++++++++++ google-gke-official/app.json | 15 +++++++++ google-maps-official/README.md | 43 ++++++++++++++++++++++++ google-maps-official/app.json | 15 +++++++++ grain-official/README.md | 38 +++++++++++----------- grain-official/app.json | 4 ++- hubspot-official/README.md | 44 +++++++++++++++++++++++++ hubspot-official/app.json | 15 +++++++++ indeed-official/README.md | 43 ++++++++++++++++++++++++ indeed-official/app.json | 15 +++++++++ jam-dev/README.md | 43 ++++++++++++++++++++++++ jam-dev/app.json | 15 +++++++++ mercadolibre-official/README.md | 44 +++++++++++++++++++++++++ mercadolibre-official/app.json | 15 +++++++++ mercadopago-official/README.md | 44 +++++++++++++++++++++++++ mercadopago-official/app.json | 15 +++++++++ vercel-official/README.md | 43 ++++++++++++++++++++++++ vercel-official/app.json | 15 +++++++++ wix-official/README.md | 43 ++++++++++++++++++++++++ wix-official/app.json | 15 +++++++++ 36 files changed, 1021 insertions(+), 20 deletions(-) create mode 100644 cloudflare-docs/README.md create mode 100644 cloudflare-docs/app.json create mode 100644 cloudflare-observability/README.md create mode 100644 cloudflare-observability/app.json create mode 100644 cloudflare-workers/README.md create mode 100644 cloudflare-workers/app.json create mode 100644 digitalocean-apps/README.md create mode 100644 digitalocean-apps/app.json create mode 100644 digitalocean-databases/README.md create mode 100644 digitalocean-databases/app.json create mode 100644 exa-search/README.md create mode 100644 exa-search/app.json create mode 100644 github-mcp-server/README.md create mode 100644 github-mcp-server/app.json create mode 100644 google-bigquery-official/README.md create mode 100644 google-bigquery-official/app.json create mode 100644 google-gke-official/README.md create mode 100644 google-gke-official/app.json create mode 100644 google-maps-official/README.md create mode 100644 google-maps-official/app.json create mode 100644 hubspot-official/README.md create mode 100644 hubspot-official/app.json create mode 100644 indeed-official/README.md create mode 100644 indeed-official/app.json create mode 100644 jam-dev/README.md create mode 100644 jam-dev/app.json create mode 100644 mercadolibre-official/README.md create mode 100644 mercadolibre-official/app.json create mode 100644 mercadopago-official/README.md create mode 100644 mercadopago-official/app.json create mode 100644 vercel-official/README.md create mode 100644 vercel-official/app.json create mode 100644 wix-official/README.md create mode 100644 wix-official/app.json diff --git a/cloudflare-docs/README.md b/cloudflare-docs/README.md new file mode 100644 index 00000000..c91c2b79 --- /dev/null +++ b/cloudflare-docs/README.md @@ -0,0 +1,43 @@ +# Cloudflare Docs MCP Server Official + +This is the **official Cloudflare Docs MCP Server**, provided directly by the Cloudflare team for accessing documentation. + +## About Cloudflare Docs + +Cloudflare Docs provides comprehensive documentation for all Cloudflare products and services. With this official MCP, you can: + +- 📚 **Search Documentation** - Find documentation through natural language queries +- 💡 **Get Help** - Get instant answers about Cloudflare products +- 🔍 **API Reference** - Access API documentation and examples +- 📖 **Guides & Tutorials** - Find step-by-step guides +- 🛠️ **Troubleshooting** - Get help resolving issues +- 🤝 **Official Integration** - Direct support and features maintained by the Cloudflare team + +## Connection + +This MCP connects to the official Cloudflare Docs server at: + +``` +https://docs.mcp.cloudflare.com/sse +``` + +## How to Use + +1. Install this MCP through the registry +2. Start asking questions about Cloudflare products +3. Get instant access to documentation and examples + +## Official Resources + +- 🌐 Website: [developers.cloudflare.com](https://developers.cloudflare.com) +- 📚 Documentation: [developers.cloudflare.com/docs](https://developers.cloudflare.com/docs) +- 🆘 Support: Contact through official Cloudflare support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Cloudflare team. + +--- + +*This MCP provides public access to Cloudflare documentation.* + diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json new file mode 100644 index 00000000..1fd81df4 --- /dev/null +++ b/cloudflare-docs/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "cloudflare-docs", + "name": "cloudflare-docs-mcp", + "frandryName": "Cloudflare Docs Official", + "category": "Documentation", + "connection": { + "type": "HTTP", + "url": "https://docs.mcp.cloudflare.com/sse" + }, + "description": "Cloudflare Docs MCP Server Official - Access Cloudflare's comprehensive documentation through natural language. Search, query, and get help with Cloudflare products and APIs. This is the official MCP server from Cloudflare.", + "icon": "https://www.cloudflare.com/favicon.ico", + "unlisted": false, + "official": true +} + diff --git a/cloudflare-observability/README.md b/cloudflare-observability/README.md new file mode 100644 index 00000000..2420c64f --- /dev/null +++ b/cloudflare-observability/README.md @@ -0,0 +1,43 @@ +# Cloudflare Observability MCP Server Official + +This is the **official Cloudflare Observability MCP Server**, provided directly by the Cloudflare team for monitoring and analytics. + +## About Cloudflare Observability + +Cloudflare Observability provides comprehensive monitoring and analytics for your Cloudflare services. With this official MCP, you can: + +- 📊 **Analytics** - Access real-time analytics and insights +- 📝 **Logs** - Query and analyze logs from Workers, WAF, and other services +- 📈 **Metrics** - Monitor performance metrics and trends +- 🔍 **Traces** - Analyze request traces and performance +- ⚠️ **Alerts** - Configure and manage alerting +- 🤝 **Official Integration** - Direct support and features maintained by the Cloudflare team + +## Connection + +This MCP connects to the official Cloudflare Observability server at: + +``` +https://observability.mcp.cloudflare.com/sse +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Cloudflare API credentials when prompted +3. Start monitoring your services with AI assistance + +## Official Resources + +- 🌐 Website: [cloudflare.com/products/cloudflare-logs](https://www.cloudflare.com/products/cloudflare-logs) +- 📚 Documentation: [developers.cloudflare.com/analytics](https://developers.cloudflare.com/analytics) +- 🆘 Support: Contact through official Cloudflare support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Cloudflare team. + +--- + +*This MCP requires an active Cloudflare account to function.* + diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json new file mode 100644 index 00000000..a7c769ec --- /dev/null +++ b/cloudflare-observability/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "cloudflare-observability", + "name": "cloudflare-observability-mcp", + "frandryName": "Cloudflare Observability Official", + "category": "Observability", + "connection": { + "type": "HTTP", + "url": "https://observability.mcp.cloudflare.com/sse" + }, + "description": "Cloudflare Observability MCP Server Official - Monitor and analyze your Cloudflare services. Access logs, metrics, analytics, and traces through natural language. This is the official MCP server from Cloudflare.", + "icon": "https://www.cloudflare.com/favicon.ico", + "unlisted": false, + "official": true +} + diff --git a/cloudflare-workers/README.md b/cloudflare-workers/README.md new file mode 100644 index 00000000..0a97035b --- /dev/null +++ b/cloudflare-workers/README.md @@ -0,0 +1,43 @@ +# Cloudflare Workers MCP Server Official + +This is the **official Cloudflare Workers MCP Server**, provided directly by the Cloudflare team for integration with Cloudflare Workers platform. + +## About Cloudflare Workers + +Cloudflare Workers is a serverless platform that lets you deploy code instantly across the globe. With this official MCP, you can: + +- ⚡ **Deploy Functions** - Deploy and manage serverless functions at the edge +- 🗄️ **KV Management** - Interact with Workers KV key-value storage +- 🔄 **Durable Objects** - Manage stateful objects and coordination +- 🔗 **Bindings** - Configure and manage Workers bindings +- 📊 **Monitor Performance** - Check metrics and logs +- 🤝 **Official Integration** - Direct support and features maintained by the Cloudflare team + +## Connection + +This MCP connects to the official Cloudflare Workers server at: + +``` +https://bindings.mcp.cloudflare.com/sse +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Cloudflare API credentials when prompted +3. Start managing your Workers with AI assistance + +## Official Resources + +- 🌐 Website: [workers.cloudflare.com](https://workers.cloudflare.com) +- 📚 Documentation: [developers.cloudflare.com/workers](https://developers.cloudflare.com/workers) +- 🆘 Support: Contact through official Cloudflare support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Cloudflare team. + +--- + +*This MCP requires an active Cloudflare account to function.* + diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json new file mode 100644 index 00000000..aab8aaf5 --- /dev/null +++ b/cloudflare-workers/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "cloudflare-workers", + "name": "cloudflare-workers-mcp", + "frandryName": "Cloudflare Workers Official", + "category": "Software Development", + "connection": { + "type": "HTTP", + "url": "https://bindings.mcp.cloudflare.com/sse" + }, + "description": "Cloudflare Workers MCP Server Official - Deploy and manage serverless functions at the edge. Interact with Workers, KV, Durable Objects, and bindings through natural language. This is the official MCP server from Cloudflare.", + "icon": "https://www.cloudflare.com/favicon.ico", + "unlisted": false, + "official": true +} + diff --git a/digitalocean-apps/README.md b/digitalocean-apps/README.md new file mode 100644 index 00000000..99530b7b --- /dev/null +++ b/digitalocean-apps/README.md @@ -0,0 +1,44 @@ +# DigitalOcean Apps MCP Server Official + +This is the **official DigitalOcean Apps MCP Server**, provided directly by the DigitalOcean team for integration with the DigitalOcean App Platform. + +## About DigitalOcean Apps + +DigitalOcean App Platform is a Platform as a Service (PaaS) that enables developers to build, deploy, and scale apps quickly. With this official MCP, you can: + +- 🚀 **Deploy Applications** - Deploy and manage your apps through natural language +- 📊 **Monitor Performance** - Check app status, metrics, and logs +- ⚡ **Scale Resources** - Adjust app resources and configurations +- 🔄 **Manage Deployments** - Control deployment workflows and rollbacks +- 🛠️ **App Configuration** - Update environment variables and settings +- 🤝 **Official Integration** - Direct support and features maintained by the DigitalOcean team + +## Connection + +This MCP connects to the official DigitalOcean Apps server at: + +``` +https://apps.mcp.digitalocean.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your DigitalOcean API token when prompted +3. Start managing your apps with AI assistance + +## Official Resources + +- 🌐 Website: [digitalocean.com/products/app-platform](https://www.digitalocean.com/products/app-platform) +- 📚 Documentation: [docs.digitalocean.com/products/app-platform](https://docs.digitalocean.com/products/app-platform) +- 📖 MCP Announcement: [digitalocean.com/blog/remote-mcp-server](https://www.digitalocean.com/blog/remote-mcp-server) +- 🆘 Support: Contact through official DigitalOcean support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the DigitalOcean team. + +--- + +*This MCP requires an active DigitalOcean account and API token to function.* + diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json new file mode 100644 index 00000000..74e6f14b --- /dev/null +++ b/digitalocean-apps/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "digitalocean-apps", + "name": "digitalocean-apps-mcp", + "frandryName": "DigitalOcean Apps Official", + "category": "Software Development", + "connection": { + "type": "HTTP", + "url": "https://apps.mcp.digitalocean.com/mcp" + }, + "description": "DigitalOcean Apps MCP Server Official - Manage your DigitalOcean applications through natural language. Deploy, monitor, and scale your apps with AI assistance. This is the official MCP server from DigitalOcean.", + "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", + "unlisted": false, + "official": true +} + diff --git a/digitalocean-databases/README.md b/digitalocean-databases/README.md new file mode 100644 index 00000000..3a0d7f14 --- /dev/null +++ b/digitalocean-databases/README.md @@ -0,0 +1,52 @@ +# DigitalOcean Databases MCP Server Official + +This is the **official DigitalOcean Databases MCP Server**, provided directly by the DigitalOcean team for integration with DigitalOcean Managed Databases. + +## About DigitalOcean Managed Databases + +DigitalOcean Managed Databases provide fully managed database solutions for PostgreSQL, MySQL, Redis, and MongoDB. With this official MCP, you can: + +- 🗄️ **Database Management** - Create and manage database clusters through natural language +- 📊 **Monitor Performance** - Check database metrics, connections, and health +- 🔧 **Configuration** - Update database settings and configurations +- 👥 **User Management** - Manage database users and permissions +- 💾 **Backup & Recovery** - Control backup schedules and restore operations +- 🔒 **Security** - Manage firewall rules and trusted sources +- 🤝 **Official Integration** - Direct support and features maintained by the DigitalOcean team + +## Supported Databases + +- PostgreSQL +- MySQL +- Redis +- MongoDB + +## Connection + +This MCP connects to the official DigitalOcean Databases server at: + +``` +https://databases.mcp.digitalocean.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your DigitalOcean API token when prompted +3. Start managing your databases with AI assistance + +## Official Resources + +- 🌐 Website: [digitalocean.com/products/managed-databases](https://www.digitalocean.com/products/managed-databases) +- 📚 Documentation: [docs.digitalocean.com/products/databases](https://docs.digitalocean.com/products/databases) +- 📖 MCP Announcement: [digitalocean.com/blog/remote-mcp-server](https://www.digitalocean.com/blog/remote-mcp-server) +- 🆘 Support: Contact through official DigitalOcean support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the DigitalOcean team. + +--- + +*This MCP requires an active DigitalOcean account and API token to function.* + diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json new file mode 100644 index 00000000..0dd9beec --- /dev/null +++ b/digitalocean-databases/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "digitalocean-databases", + "name": "digitalocean-databases-mcp", + "frandryName": "DigitalOcean Databases Official", + "category": "Database", + "connection": { + "type": "HTTP", + "url": "https://databases.mcp.digitalocean.com/mcp" + }, + "description": "DigitalOcean Databases MCP Server Official - Manage your DigitalOcean managed databases through natural language. Create, configure, and monitor PostgreSQL, MySQL, Redis, and MongoDB databases with AI assistance. This is the official MCP server from DigitalOcean.", + "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", + "unlisted": false, + "official": true +} + diff --git a/exa-search/README.md b/exa-search/README.md new file mode 100644 index 00000000..747f89d4 --- /dev/null +++ b/exa-search/README.md @@ -0,0 +1,43 @@ +# Exa Search MCP Server Official + +This is the **official Exa Search MCP Server**, provided directly by the Exa team for integration with Exa's AI-powered search engine. + +## About Exa Search + +Exa is an AI-powered search engine designed to find high-quality, relevant content. With this official MCP, you can: + +- 🔍 **Semantic Search** - Search with natural language understanding +- 📊 **Content Discovery** - Find high-quality articles, papers, and resources +- 🎯 **Precise Results** - Get accurate, relevant search results +- 🌐 **Web Crawling** - Access comprehensive web data +- 💡 **AI-Powered** - Leverage AI for better search understanding +- 🤝 **Official Integration** - Direct support and features maintained by the Exa team + +## Connection + +This MCP connects to the official Exa Search server at: + +``` +https://mcp.exa.ai/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Exa API key when prompted +3. Start searching with AI-powered semantic understanding + +## Official Resources + +- 🌐 Website: [exa.ai](https://exa.ai) +- 📚 Documentation: [docs.exa.ai](https://docs.exa.ai) +- 🆘 Support: Contact through official Exa support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Exa team. + +--- + +*This MCP requires an active Exa API key to function.* + diff --git a/exa-search/app.json b/exa-search/app.json new file mode 100644 index 00000000..4e0fa63c --- /dev/null +++ b/exa-search/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "exa-search", + "name": "exa-search-mcp", + "frandryName": "Exa Search Official", + "category": "Search", + "connection": { + "type": "HTTP", + "url": "https://mcp.exa.ai/mcp" + }, + "description": "Exa Search MCP Server Official - AI-powered search engine for finding high-quality content. Search the web with semantic understanding and get relevant results. This is the official MCP server from Exa.", + "icon": "https://exa.ai/favicon.ico", + "unlisted": false, + "official": true +} + diff --git a/github-mcp-server/README.md b/github-mcp-server/README.md new file mode 100644 index 00000000..28c60584 --- /dev/null +++ b/github-mcp-server/README.md @@ -0,0 +1,43 @@ +# GitHub MCP Server Official + +This is the **official GitHub MCP Server**, provided directly by the GitHub team for integration with the GitHub platform through Model Context Protocol. + +## About GitHub MCP Server + +GitHub MCP Server is the official Model Context Protocol server from GitHub that allows AI tools, agents, and assistants to interact directly with the GitHub platform. With this official MCP, you can: + +- 📂 **Repository Management** - Read and interact with GitHub repositories +- 🐛 **Issues & Pull Requests** - Manage issues and pull requests through natural language +- 🔍 **Code Analysis** - Analyze code and repository structure +- ⚙️ **Workflow Automation** - Automate GitHub workflows and actions +- 💬 **Natural Language Interface** - Interact with GitHub using natural language +- 🤝 **Official Integration** - Direct support and features maintained by the GitHub team + +## Connection + +This MCP connects to the official GitHub MCP server at: + +``` +https://api.githubcopilot.com/mcp/ +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your GitHub credentials when prompted +3. Start using the tools provided by GitHub MCP Server + +## Official Resources + +- 🌐 GitHub: [github.com/github/github-mcp-server](https://github.com/github/github-mcp-server) +- 📚 Documentation: [docs.github.com](https://docs.github.com) +- 🆘 Support: Contact through official GitHub support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the GitHub team. + +--- + +*This MCP requires an active GitHub account to function.* + diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json new file mode 100644 index 00000000..ccd0fd5b --- /dev/null +++ b/github-mcp-server/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "github", + "name": "github-mcp-server", + "frandryName": "GitHub Official", + "category": "Developer Tools", + "connection": { + "type": "HTTP", + "url": "https://api.githubcopilot.com/mcp/" + }, + "description": "GitHub MCP Server Official - Interact with GitHub platform through natural language. Manage repositories, issues, pull requests, analyze code, and automate workflows. This is the official MCP server from GitHub.", + "icon": "https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png", + "unlisted": false, + "official": true +} + diff --git a/google-bigquery-official/README.md b/google-bigquery-official/README.md new file mode 100644 index 00000000..f4d010f6 --- /dev/null +++ b/google-bigquery-official/README.md @@ -0,0 +1,43 @@ +# Google BigQuery MCP Server Official + +This is the **official Google BigQuery MCP Server**, provided directly by the Google Cloud team for integration with BigQuery. + +## About Google BigQuery + +BigQuery is Google's fully managed, serverless data warehouse for analytics. With this official MCP, you can: + +- 📊 **SQL Queries** - Run complex SQL queries on massive datasets +- 🗄️ **Dataset Management** - Create and manage datasets and tables +- 📈 **Analytics** - Perform advanced analytics and ML predictions +- 💰 **Cost Analysis** - Monitor and optimize query costs +- 🔄 **Data Loading** - Import data from various sources +- 🤝 **Official Integration** - Direct support and features maintained by the Google Cloud team + +## Connection + +This MCP connects to the official Google BigQuery server at: + +``` +https://bigquery.googleapis.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Google Cloud credentials when prompted +3. Start analyzing data with AI assistance + +## Official Resources + +- 🌐 Website: [cloud.google.com/bigquery](https://cloud.google.com/bigquery) +- 📚 Documentation: [cloud.google.com/bigquery/docs](https://cloud.google.com/bigquery/docs) +- 🆘 Support: Contact through Google Cloud support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Google Cloud team. + +--- + +*This MCP requires an active Google Cloud account with BigQuery enabled.* + diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json new file mode 100644 index 00000000..2770472c --- /dev/null +++ b/google-bigquery-official/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "google-bigquery", + "name": "google-bigquery-mcp", + "frandryName": "Google BigQuery Official", + "category": "Data Analysis", + "connection": { + "type": "HTTP", + "url": "https://bigquery.googleapis.com/mcp" + }, + "description": "Google BigQuery MCP Server Official - Analyze massive datasets with serverless data warehouse. Run SQL queries, manage datasets, and perform analytics through natural language. This is the official MCP server from Google.", + "icon": "https://www.gstatic.com/images/branding/product/2x/bigquery_64dp.png", + "unlisted": false, + "official": true +} + diff --git a/google-gke-official/README.md b/google-gke-official/README.md new file mode 100644 index 00000000..90d436d7 --- /dev/null +++ b/google-gke-official/README.md @@ -0,0 +1,43 @@ +# Google GKE MCP Server Official + +This is the **official Google GKE MCP Server**, provided directly by the Google Cloud team for integration with Google Kubernetes Engine. + +## About Google GKE + +Google Kubernetes Engine (GKE) is a managed Kubernetes service for deploying containerized applications. With this official MCP, you can: + +- 🚀 **Cluster Management** - Create and manage Kubernetes clusters +- 📦 **Container Deployment** - Deploy and scale containerized apps +- 📊 **Monitoring** - Monitor cluster health and performance +- 🔒 **Security** - Manage security policies and access control +- ⚙️ **Configuration** - Configure nodes, networking, and resources +- 🤝 **Official Integration** - Direct support and features maintained by the Google Cloud team + +## Connection + +This MCP connects to the official Google GKE server at: + +``` +https://container.googleapis.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Google Cloud credentials when prompted +3. Start managing your Kubernetes clusters with AI assistance + +## Official Resources + +- 🌐 Website: [cloud.google.com/kubernetes-engine](https://cloud.google.com/kubernetes-engine) +- 📚 Documentation: [cloud.google.com/kubernetes-engine/docs](https://cloud.google.com/kubernetes-engine/docs) +- 🆘 Support: Contact through Google Cloud support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Google Cloud team. + +--- + +*This MCP requires an active Google Cloud account with GKE enabled.* + diff --git a/google-gke-official/app.json b/google-gke-official/app.json new file mode 100644 index 00000000..e7efd90b --- /dev/null +++ b/google-gke-official/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "google-gke", + "name": "google-gke-mcp", + "frandryName": "Google GKE Official", + "category": "Developer Tools", + "connection": { + "type": "HTTP", + "url": "https://container.googleapis.com/mcp" + }, + "description": "Google GKE MCP Server Official - Manage Kubernetes clusters on Google Cloud. Deploy, scale, and monitor containerized applications through natural language. This is the official MCP server from Google.", + "icon": "https://www.gstatic.com/images/branding/product/2x/gke_64dp.png", + "unlisted": false, + "official": true +} + diff --git a/google-maps-official/README.md b/google-maps-official/README.md new file mode 100644 index 00000000..c2dd7990 --- /dev/null +++ b/google-maps-official/README.md @@ -0,0 +1,43 @@ +# Google Maps MCP Server Official + +This is the **official Google Maps MCP Server**, provided directly by the Google Maps team for integration with Google Maps Platform. + +## About Google Maps + +Google Maps Platform provides APIs for maps, routes, and places. With this official MCP, you can: + +- 🗺️ **Mapping** - Access and display Google Maps +- 📍 **Geocoding** - Convert addresses to coordinates and vice versa +- 🧭 **Directions** - Get routing and navigation data +- 📌 **Places** - Search for places and get detailed information +- 🌍 **Geographic Data** - Access geographic and location data +- 🤝 **Official Integration** - Direct support and features maintained by the Google Maps team + +## Connection + +This MCP connects to the official Google Maps server at: + +``` +https://mapstools.googleapis.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Google Maps API key when prompted +3. Start using Maps services with AI assistance + +## Official Resources + +- 🌐 Website: [developers.google.com/maps](https://developers.google.com/maps) +- 📚 Documentation: [developers.google.com/maps/documentation](https://developers.google.com/maps/documentation) +- 🆘 Support: Contact through Google Maps Platform support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Google Maps team. + +--- + +*This MCP requires an active Google Maps Platform API key.* + diff --git a/google-maps-official/app.json b/google-maps-official/app.json new file mode 100644 index 00000000..84ba9d3d --- /dev/null +++ b/google-maps-official/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "google-maps", + "name": "google-maps-mcp", + "frandryName": "Google Maps Official", + "category": "Mapping", + "connection": { + "type": "HTTP", + "url": "https://mapstools.googleapis.com/mcp" + }, + "description": "Google Maps MCP Server Official - Access Google Maps APIs through natural language. Get directions, geocoding, places data, and mapping services. This is the official MCP server from Google.", + "icon": "https://www.gstatic.com/images/branding/product/2x/maps_64dp.png", + "unlisted": false, + "official": true +} + diff --git a/grain-official/README.md b/grain-official/README.md index 75ff311d..ada7d988 100644 --- a/grain-official/README.md +++ b/grain-official/README.md @@ -1,42 +1,42 @@ # Grain Official MCP -Este é o **MCP oficial do Grain**, fornecido diretamente pela equipe do Grain para integração com a plataforma de gravação e análise de reuniões. +This is the **official Grain MCP**, provided directly by the Grain team for integration with the meeting recording and analysis platform. -## Sobre o Grain +## About Grain -O Grain é uma plataforma poderosa para gravação, transcrição e análise de reuniões. Com este MCP oficial, você pode: +Grain is a powerful platform for recording, transcribing, and analyzing meetings. With this official MCP, you can: -- 📹 **Acessar suas gravações** - Recupere e gerencie suas reuniões gravadas -- 📝 **Consultar transcrições** - Acesse transcrições completas de suas reuniões -- 💡 **Extrair insights** - Obtenha insights e análises de suas reuniões -- 🔍 **Buscar conteúdo** - Pesquise através de todas as suas reuniões e transcrições -- 🤝 **Integração oficial** - Suporte direto e funcionalidades mantidas pela equipe Grain +- 📹 **Access your recordings** - Retrieve and manage your recorded meetings +- 📝 **Query transcripts** - Access complete transcripts of your meetings +- 💡 **Extract insights** - Get insights and analysis from your meetings +- 🔍 **Search content** - Search through all your meetings and transcripts +- 🤝 **Official integration** - Direct support and features maintained by the Grain team -## Conexão +## Connection -Este MCP se conecta ao servidor oficial do Grain em: +This MCP connects to the official Grain server at: ``` https://api.grain.com/_/mcp ``` -## Como Usar +## How to Use -1. Instale este MCP através do registry -2. Configure suas credenciais do Grain quando solicitado -3. Comece a usar as ferramentas disponibilizadas pelo Grain +1. Install this MCP through the registry +2. Configure your Grain credentials when prompted +3. Start using the tools provided by Grain -## Recursos Oficiais +## Official Resources - 🌐 Website: [grain.com](https://grain.com) -- 📚 Documentação: [docs.grain.com](https://docs.grain.com) -- 🆘 Suporte: Entre em contato através do suporte oficial do Grain +- 📚 Documentation: [docs.grain.com](https://docs.grain.com) +- 🆘 Support: Contact through official Grain support ## Status -✅ **MCP Oficial** - Este é o MCP oficial mantido pela equipe do Grain. +✅ **Official MCP** - This is the official MCP maintained by the Grain team. --- -*Este MCP requer uma conta ativa no Grain para funcionar.* +*This MCP requires an active Grain account to function.* diff --git a/grain-official/app.json b/grain-official/app.json index 30a6fb14..19aa7258 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -1,6 +1,8 @@ { "scopeName": "grain", - "name": "Grain mcp", + "name": "grain-mcp", + "frandryName":"Grain Official", + "category": "Collaboration", "connection": { "type": "HTTP", "url": "https://api.grain.com/_/mcp" diff --git a/hubspot-official/README.md b/hubspot-official/README.md new file mode 100644 index 00000000..8a89a1ea --- /dev/null +++ b/hubspot-official/README.md @@ -0,0 +1,44 @@ +# HubSpot MCP Server Official + +This is the **official HubSpot MCP Server**, provided directly by the HubSpot team for integration with HubSpot CRM. + +## About HubSpot + +HubSpot is a leading CRM platform for marketing, sales, and customer service. With this official MCP, you can: + +- 👥 **Contact Management** - Create and manage contacts and companies +- 💼 **Deals & Pipeline** - Track deals and sales pipeline +- 📧 **Email Marketing** - Send and manage email campaigns +- 🎫 **Ticket Management** - Handle customer support tickets +- 📊 **Analytics** - Access CRM analytics and reports +- 🔄 **Workflow Automation** - Automate marketing and sales processes +- 🤝 **Official Integration** - Direct support and features maintained by the HubSpot team + +## Connection + +This MCP connects to the official HubSpot server at: + +``` +https://app.hubspot.com/mcp/v1/http +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your HubSpot API key when prompted +3. Start managing your CRM with AI assistance + +## Official Resources + +- 🌐 Website: [hubspot.com](https://www.hubspot.com) +- 📚 Documentation: [developers.hubspot.com](https://developers.hubspot.com) +- 🆘 Support: Contact through official HubSpot support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the HubSpot team. + +--- + +*This MCP requires an active HubSpot account and API key.* + diff --git a/hubspot-official/app.json b/hubspot-official/app.json new file mode 100644 index 00000000..6a84a16b --- /dev/null +++ b/hubspot-official/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "hubspot", + "name": "hubspot-mcp", + "frandryName": "HubSpot Official", + "category": "CRM", + "connection": { + "type": "HTTP", + "url": "https://app.hubspot.com/mcp/v1/http" + }, + "description": "HubSpot MCP Server Official - Manage your CRM, marketing, sales, and service operations. Create contacts, deals, tickets, and automate workflows through natural language. This is the official MCP server from HubSpot.", + "icon": "https://www.hubspot.com/favicon.ico", + "unlisted": false, + "official": true +} + diff --git a/indeed-official/README.md b/indeed-official/README.md new file mode 100644 index 00000000..d00395dd --- /dev/null +++ b/indeed-official/README.md @@ -0,0 +1,43 @@ +# Indeed MCP Server Official + +This is the **official Indeed MCP Server**, provided directly by the Indeed team for integration with the world's largest job site. + +## About Indeed + +Indeed is the world's #1 job site with millions of job listings. With this official MCP, you can: + +- 🔍 **Job Search** - Search and filter through millions of job listings +- 💼 **Recruitment** - Post and manage job listings +- 📊 **Analytics** - Access hiring analytics and insights +- 👥 **Candidate Management** - Manage applications and candidates +- 📈 **Market Data** - Get salary insights and market trends +- 🤝 **Official Integration** - Direct support and features maintained by the Indeed team + +## Connection + +This MCP connects to the official Indeed server at: + +``` +https://mcp.indeed.com/claude/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Indeed credentials when prompted +3. Start searching jobs and managing recruitment with AI assistance + +## Official Resources + +- 🌐 Website: [indeed.com](https://www.indeed.com) +- 📚 For Employers: [indeed.com/hire](https://www.indeed.com/hire) +- 🆘 Support: Contact through official Indeed support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Indeed team. + +--- + +*This MCP provides access to Indeed's job search and recruitment platform.* + diff --git a/indeed-official/app.json b/indeed-official/app.json new file mode 100644 index 00000000..7cee1431 --- /dev/null +++ b/indeed-official/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "indeed", + "name": "indeed-mcp", + "frandryName": "Indeed Official", + "category": "Job Board", + "connection": { + "type": "HTTP", + "url": "https://mcp.indeed.com/claude/mcp" + }, + "description": "Indeed MCP Server Official - Search and interact with job listings through natural language. Access millions of jobs, post listings, and manage recruitment. This is the official MCP server from Indeed.", + "icon": "https://www.indeed.com/favicon.ico", + "unlisted": false, + "official": true +} + diff --git a/jam-dev/README.md b/jam-dev/README.md new file mode 100644 index 00000000..691ec435 --- /dev/null +++ b/jam-dev/README.md @@ -0,0 +1,43 @@ +# Jam MCP Server Official + +This is the **official Jam MCP Server**, provided directly by the Jam team for integration with Jam's bug reporting platform. + +## About Jam + +Jam is the bug reporting tool that makes debugging faster. With this official MCP, you can: + +- 🐛 **Bug Reporting** - Create detailed bug reports instantly +- 📸 **Screenshots & Videos** - Capture visual evidence automatically +- 🔍 **Console Logs** - Include console logs and errors +- 🌐 **Network Data** - Track network requests and responses +- 🔄 **Integration** - Connect with issue trackers (Jira, Linear, GitHub) +- 🤝 **Official Integration** - Direct support and features maintained by the Jam team + +## Connection + +This MCP connects to the official Jam server at: + +``` +https://mcp.jam.dev/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Jam credentials when prompted +3. Start creating and managing bug reports with AI assistance + +## Official Resources + +- 🌐 Website: [jam.dev](https://jam.dev) +- 📚 Documentation: [jam.dev/docs](https://jam.dev/docs) +- 🆘 Support: Contact through official Jam support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Jam team. + +--- + +*This MCP requires an active Jam account to function.* + diff --git a/jam-dev/app.json b/jam-dev/app.json new file mode 100644 index 00000000..bf9df501 --- /dev/null +++ b/jam-dev/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "jam", + "name": "jam-dev-mcp", + "frandryName": "Jam Official", + "category": "Software Development", + "connection": { + "type": "HTTP", + "url": "https://mcp.jam.dev/mcp" + }, + "description": "Jam MCP Server Official - Debug faster with instant bug reports. Capture, share, and track bugs with screenshots, console logs, and network data. This is the official MCP server from Jam.", + "icon": "https://jam.dev/favicon.ico", + "unlisted": false, + "official": true +} + diff --git a/mercadolibre-official/README.md b/mercadolibre-official/README.md new file mode 100644 index 00000000..5d2f2e67 --- /dev/null +++ b/mercadolibre-official/README.md @@ -0,0 +1,44 @@ +# Mercado Libre MCP Server Official + +This is the **official Mercado Libre MCP Server**, provided directly by the Mercado Libre team for integration with Latin America's largest e-commerce platform. + +## About Mercado Libre + +Mercado Libre is the leading e-commerce and fintech ecosystem in Latin America. With this official MCP, you can: + +- 🛍️ **Product Listings** - Create and manage product listings +- 📦 **Order Management** - Handle orders and fulfillment +- 📊 **Sales Analytics** - Track sales performance and metrics +- 🚚 **Logistics** - Manage shipping and delivery +- 💬 **Customer Service** - Handle questions and messages +- 🏪 **Store Management** - Manage your seller reputation and store +- 🤝 **Official Integration** - Direct support and features maintained by the Mercado Libre team + +## Connection + +This MCP connects to the official Mercado Libre server at: + +``` +https://mcp.mercadolibre.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Mercado Libre API credentials when prompted +3. Start managing your e-commerce operations with AI assistance + +## Official Resources + +- 🌐 Website: [mercadolibre.com](https://www.mercadolibre.com) +- 📚 Documentation: [developers.mercadolibre.com](https://developers.mercadolibre.com) +- 🆘 Support: Contact through official Mercado Libre support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Mercado Libre team. + +--- + +*This MCP requires an active Mercado Libre seller account and API credentials.* + diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json new file mode 100644 index 00000000..fda8d7cb --- /dev/null +++ b/mercadolibre-official/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "mercadolibre", + "name": "mercadolibre-mcp", + "frandryName": "Mercado Libre Official", + "category": "E-Commerce", + "connection": { + "type": "HTTP", + "url": "https://mcp.mercadolibre.com/mcp" + }, + "description": "Mercado Libre MCP Server Official - Manage your e-commerce operations on Latin America's largest marketplace. List products, manage orders, track sales, and handle logistics through natural language. This is the official MCP server from Mercado Libre.", + "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", + "unlisted": false, + "official": true +} + diff --git a/mercadopago-official/README.md b/mercadopago-official/README.md new file mode 100644 index 00000000..6aeef156 --- /dev/null +++ b/mercadopago-official/README.md @@ -0,0 +1,44 @@ +# Mercado Pago MCP Server Official + +This is the **official Mercado Pago MCP Server**, provided directly by the Mercado Pago team for integration with Latin America's leading payment platform. + +## About Mercado Pago + +Mercado Pago is the leading fintech platform in Latin America, offering payment processing and financial services. With this official MCP, you can: + +- 💳 **Payment Processing** - Process credit card, debit, and digital payments +- 💰 **Transaction Management** - Track and manage transactions +- 🔄 **Refunds & Chargebacks** - Handle refunds and disputes +- 📊 **Financial Analytics** - Access payment analytics and reports +- 🔔 **Subscriptions** - Manage recurring payments and subscriptions +- 🔐 **Security** - Manage fraud prevention and security settings +- 🤝 **Official Integration** - Direct support and features maintained by the Mercado Pago team + +## Connection + +This MCP connects to the official Mercado Pago server at: + +``` +https://mcp.mercadopago.com/mcp +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Mercado Pago API credentials when prompted +3. Start managing payments with AI assistance + +## Official Resources + +- 🌐 Website: [mercadopago.com](https://www.mercadopago.com) +- 📚 Documentation: [developers.mercadopago.com](https://www.mercadopago.com/developers) +- 🆘 Support: Contact through official Mercado Pago support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Mercado Pago team. + +--- + +*This MCP requires an active Mercado Pago account and API credentials.* + diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json new file mode 100644 index 00000000..462d18c9 --- /dev/null +++ b/mercadopago-official/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "mercadopago", + "name": "mercadopago-mcp", + "frandryName": "Mercado Pago Official", + "category": "Payments", + "connection": { + "type": "HTTP", + "url": "https://mcp.mercadopago.com/mcp" + }, + "description": "Mercado Pago MCP Server Official - Process payments and manage financial operations. Handle transactions, refunds, subscriptions, and payment analytics through natural language. This is the official MCP server from Mercado Pago.", + "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", + "unlisted": false, + "official": true +} + diff --git a/vercel-official/README.md b/vercel-official/README.md new file mode 100644 index 00000000..c1d7bc6f --- /dev/null +++ b/vercel-official/README.md @@ -0,0 +1,43 @@ +# Vercel MCP Server Official + +This is the **official Vercel MCP Server**, provided directly by the Vercel team for integration with Vercel's frontend platform. + +## About Vercel + +Vercel is the platform for frontend developers, providing zero-configuration deployments. With this official MCP, you can: + +- 🚀 **Deployments** - Deploy and manage your applications +- 📊 **Analytics** - Access Web Analytics and performance data +- 🌐 **Domains** - Manage custom domains and DNS +- ⚡ **Edge Functions** - Deploy and manage serverless functions +- 🔄 **Git Integration** - Manage GitHub, GitLab, and Bitbucket connections +- 🤝 **Official Integration** - Direct support and features maintained by the Vercel team + +## Connection + +This MCP connects to the official Vercel server at: + +``` +https://mcp.vercel.com/ +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Vercel API token when prompted +3. Start managing your deployments with AI assistance + +## Official Resources + +- 🌐 Website: [vercel.com](https://vercel.com) +- 📚 Documentation: [vercel.com/docs](https://vercel.com/docs) +- 🆘 Support: Contact through official Vercel support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Vercel team. + +--- + +*This MCP requires an active Vercel account to function.* + diff --git a/vercel-official/app.json b/vercel-official/app.json new file mode 100644 index 00000000..15370678 --- /dev/null +++ b/vercel-official/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "vercel", + "name": "vercel-mcp", + "frandryName": "Vercel Official", + "category": "Software Development", + "connection": { + "type": "HTTP", + "url": "https://mcp.vercel.com/" + }, + "description": "Vercel MCP Server Official - Deploy and manage your frontend applications. Interact with projects, deployments, domains, and serverless functions through natural language. This is the official MCP server from Vercel.", + "icon": "https://vercel.com/favicon.ico", + "unlisted": false, + "official": true +} + diff --git a/wix-official/README.md b/wix-official/README.md new file mode 100644 index 00000000..00017d3a --- /dev/null +++ b/wix-official/README.md @@ -0,0 +1,43 @@ +# Wix MCP Server Official + +This is the **official Wix MCP Server**, provided directly by the Wix team for integration with Wix's website building platform. + +## About Wix + +Wix is a leading website builder platform with powerful CMS and e-commerce capabilities. With this official MCP, you can: + +- 🎨 **Website Building** - Create and customize websites through natural language +- 📝 **Content Management** - Manage pages, blogs, and content +- 🛍️ **E-Commerce** - Handle products, orders, and inventory +- 📊 **Analytics** - Access site analytics and visitor data +- 🔌 **Apps & Integrations** - Manage Wix apps and third-party integrations +- 🤝 **Official Integration** - Direct support and features maintained by the Wix team + +## Connection + +This MCP connects to the official Wix server at: + +``` +https://mcp.wix.com/sse +``` + +## How to Use + +1. Install this MCP through the registry +2. Configure your Wix credentials when prompted +3. Start building and managing your websites with AI assistance + +## Official Resources + +- 🌐 Website: [wix.com](https://www.wix.com) +- 📚 Documentation: [dev.wix.com](https://dev.wix.com) +- 🆘 Support: Contact through official Wix support + +## Status + +✅ **Official MCP** - This is the official MCP server maintained by the Wix team. + +--- + +*This MCP requires an active Wix account to function.* + diff --git a/wix-official/app.json b/wix-official/app.json new file mode 100644 index 00000000..646bd4a4 --- /dev/null +++ b/wix-official/app.json @@ -0,0 +1,15 @@ +{ + "scopeName": "wix", + "name": "wix-mcp", + "frandryName": "Wix Official", + "category": "CMS", + "connection": { + "type": "HTTP", + "url": "https://mcp.wix.com/sse" + }, + "description": "Wix MCP Server Official - Build and manage websites through natural language. Create pages, manage content, customize designs, and handle e-commerce. This is the official MCP server from Wix.", + "icon": "https://www.wix.com/favicon.ico", + "unlisted": false, + "official": true +} + From 8f3a2a254a8c6a9fcffcdfa4ce3206217a908ea3 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 19:48:32 -0300 Subject: [PATCH 08/31] refactor(app.json): Update scopeName to "official" for multiple applications - Changed scopeName from specific identifiers to "official" for consistency across various app configurations, including Cloudflare Docs, Observability, Workers, DigitalOcean, Google services, and others. --- cloudflare-docs/app.json | 2 +- cloudflare-observability/app.json | 2 +- cloudflare-workers/app.json | 2 +- digitalocean-apps/app.json | 2 +- digitalocean-databases/app.json | 2 +- exa-search/app.json | 2 +- github-mcp-server/app.json | 2 +- google-bigquery-official/app.json | 2 +- google-gke-official/app.json | 2 +- google-maps-official/app.json | 2 +- grain-official/app.json | 2 +- hubspot-official/app.json | 2 +- indeed-official/app.json | 2 +- jam-dev/app.json | 2 +- mercadolibre-official/app.json | 2 +- mercadopago-official/app.json | 2 +- vercel-official/app.json | 2 +- wix-official/app.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json index 1fd81df4..c299fb75 100644 --- a/cloudflare-docs/app.json +++ b/cloudflare-docs/app.json @@ -1,5 +1,5 @@ { - "scopeName": "cloudflare-docs", + "scopeName": "official", "name": "cloudflare-docs-mcp", "frandryName": "Cloudflare Docs Official", "category": "Documentation", diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json index a7c769ec..280c28b0 100644 --- a/cloudflare-observability/app.json +++ b/cloudflare-observability/app.json @@ -1,5 +1,5 @@ { - "scopeName": "cloudflare-observability", + "scopeName": "official", "name": "cloudflare-observability-mcp", "frandryName": "Cloudflare Observability Official", "category": "Observability", diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json index aab8aaf5..d4273968 100644 --- a/cloudflare-workers/app.json +++ b/cloudflare-workers/app.json @@ -1,5 +1,5 @@ { - "scopeName": "cloudflare-workers", + "scopeName": "official", "name": "cloudflare-workers-mcp", "frandryName": "Cloudflare Workers Official", "category": "Software Development", diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json index 74e6f14b..c6c22172 100644 --- a/digitalocean-apps/app.json +++ b/digitalocean-apps/app.json @@ -1,5 +1,5 @@ { - "scopeName": "digitalocean-apps", + "scopeName": "official", "name": "digitalocean-apps-mcp", "frandryName": "DigitalOcean Apps Official", "category": "Software Development", diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json index 0dd9beec..1483d391 100644 --- a/digitalocean-databases/app.json +++ b/digitalocean-databases/app.json @@ -1,5 +1,5 @@ { - "scopeName": "digitalocean-databases", + "scopeName": "official", "name": "digitalocean-databases-mcp", "frandryName": "DigitalOcean Databases Official", "category": "Database", diff --git a/exa-search/app.json b/exa-search/app.json index 4e0fa63c..8b3afbc8 100644 --- a/exa-search/app.json +++ b/exa-search/app.json @@ -1,5 +1,5 @@ { - "scopeName": "exa-search", + "scopeName": "official", "name": "exa-search-mcp", "frandryName": "Exa Search Official", "category": "Search", diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json index ccd0fd5b..492690c5 100644 --- a/github-mcp-server/app.json +++ b/github-mcp-server/app.json @@ -1,5 +1,5 @@ { - "scopeName": "github", + "scopeName": "official", "name": "github-mcp-server", "frandryName": "GitHub Official", "category": "Developer Tools", diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json index 2770472c..5513911a 100644 --- a/google-bigquery-official/app.json +++ b/google-bigquery-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "google-bigquery", + "scopeName": "official", "name": "google-bigquery-mcp", "frandryName": "Google BigQuery Official", "category": "Data Analysis", diff --git a/google-gke-official/app.json b/google-gke-official/app.json index e7efd90b..200c2b1e 100644 --- a/google-gke-official/app.json +++ b/google-gke-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "google-gke", + "scopeName": "official", "name": "google-gke-mcp", "frandryName": "Google GKE Official", "category": "Developer Tools", diff --git a/google-maps-official/app.json b/google-maps-official/app.json index 84ba9d3d..ccb9d22b 100644 --- a/google-maps-official/app.json +++ b/google-maps-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "google-maps", + "scopeName": "official", "name": "google-maps-mcp", "frandryName": "Google Maps Official", "category": "Mapping", diff --git a/grain-official/app.json b/grain-official/app.json index 19aa7258..db58e9b5 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "grain", + "scopeName": "official", "name": "grain-mcp", "frandryName":"Grain Official", "category": "Collaboration", diff --git a/hubspot-official/app.json b/hubspot-official/app.json index 6a84a16b..189e9dea 100644 --- a/hubspot-official/app.json +++ b/hubspot-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "hubspot", + "scopeName": "official", "name": "hubspot-mcp", "frandryName": "HubSpot Official", "category": "CRM", diff --git a/indeed-official/app.json b/indeed-official/app.json index 7cee1431..83311cd6 100644 --- a/indeed-official/app.json +++ b/indeed-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "indeed", + "scopeName": "official", "name": "indeed-mcp", "frandryName": "Indeed Official", "category": "Job Board", diff --git a/jam-dev/app.json b/jam-dev/app.json index bf9df501..b4b7f717 100644 --- a/jam-dev/app.json +++ b/jam-dev/app.json @@ -1,5 +1,5 @@ { - "scopeName": "jam", + "scopeName": "official", "name": "jam-dev-mcp", "frandryName": "Jam Official", "category": "Software Development", diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json index fda8d7cb..572d8ef7 100644 --- a/mercadolibre-official/app.json +++ b/mercadolibre-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "mercadolibre", + "scopeName": "official", "name": "mercadolibre-mcp", "frandryName": "Mercado Libre Official", "category": "E-Commerce", diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json index 462d18c9..cfcb1577 100644 --- a/mercadopago-official/app.json +++ b/mercadopago-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "mercadopago", + "scopeName": "official", "name": "mercadopago-mcp", "frandryName": "Mercado Pago Official", "category": "Payments", diff --git a/vercel-official/app.json b/vercel-official/app.json index 15370678..6758e1e1 100644 --- a/vercel-official/app.json +++ b/vercel-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "vercel", + "scopeName": "official", "name": "vercel-mcp", "frandryName": "Vercel Official", "category": "Software Development", diff --git a/wix-official/app.json b/wix-official/app.json index 646bd4a4..9a7dc76e 100644 --- a/wix-official/app.json +++ b/wix-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "wix", + "scopeName": "official", "name": "wix-mcp", "frandryName": "Wix Official", "category": "CMS", From e23d1bcee0297d1fc4c1367258b48194145d3d1d Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 19:59:25 -0300 Subject: [PATCH 09/31] refactor(app.json): Update scopeName for multiple applications - Changed scopeName from "official" to specific identifiers for various applications, including Cloudflare Docs, Observability, Workers, DigitalOcean, Google services, and others, to enhance clarity and specificity. --- cloudflare-docs/app.json | 2 +- cloudflare-observability/app.json | 2 +- cloudflare-workers/app.json | 2 +- digitalocean-apps/app.json | 2 +- digitalocean-databases/app.json | 2 +- exa-search/app.json | 2 +- github-mcp-server/app.json | 2 +- google-bigquery-official/app.json | 2 +- google-gke-official/app.json | 2 +- google-maps-official/app.json | 2 +- grain-official/app.json | 2 +- hubspot-official/app.json | 2 +- indeed-official/app.json | 2 +- jam-dev/app.json | 2 +- mercadolibre-official/app.json | 2 +- mercadopago-official/app.json | 2 +- vercel-official/app.json | 2 +- wix-official/app.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json index c299fb75..1fd81df4 100644 --- a/cloudflare-docs/app.json +++ b/cloudflare-docs/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "cloudflare-docs", "name": "cloudflare-docs-mcp", "frandryName": "Cloudflare Docs Official", "category": "Documentation", diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json index 280c28b0..a7c769ec 100644 --- a/cloudflare-observability/app.json +++ b/cloudflare-observability/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "cloudflare-observability", "name": "cloudflare-observability-mcp", "frandryName": "Cloudflare Observability Official", "category": "Observability", diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json index d4273968..aab8aaf5 100644 --- a/cloudflare-workers/app.json +++ b/cloudflare-workers/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "cloudflare-workers", "name": "cloudflare-workers-mcp", "frandryName": "Cloudflare Workers Official", "category": "Software Development", diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json index c6c22172..74e6f14b 100644 --- a/digitalocean-apps/app.json +++ b/digitalocean-apps/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "digitalocean-apps", "name": "digitalocean-apps-mcp", "frandryName": "DigitalOcean Apps Official", "category": "Software Development", diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json index 1483d391..0dd9beec 100644 --- a/digitalocean-databases/app.json +++ b/digitalocean-databases/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "digitalocean-databases", "name": "digitalocean-databases-mcp", "frandryName": "DigitalOcean Databases Official", "category": "Database", diff --git a/exa-search/app.json b/exa-search/app.json index 8b3afbc8..4e0fa63c 100644 --- a/exa-search/app.json +++ b/exa-search/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "exa-search", "name": "exa-search-mcp", "frandryName": "Exa Search Official", "category": "Search", diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json index 492690c5..ccd0fd5b 100644 --- a/github-mcp-server/app.json +++ b/github-mcp-server/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "github", "name": "github-mcp-server", "frandryName": "GitHub Official", "category": "Developer Tools", diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json index 5513911a..2770472c 100644 --- a/google-bigquery-official/app.json +++ b/google-bigquery-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "google-bigquery", "name": "google-bigquery-mcp", "frandryName": "Google BigQuery Official", "category": "Data Analysis", diff --git a/google-gke-official/app.json b/google-gke-official/app.json index 200c2b1e..e7efd90b 100644 --- a/google-gke-official/app.json +++ b/google-gke-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "google-gke", "name": "google-gke-mcp", "frandryName": "Google GKE Official", "category": "Developer Tools", diff --git a/google-maps-official/app.json b/google-maps-official/app.json index ccb9d22b..84ba9d3d 100644 --- a/google-maps-official/app.json +++ b/google-maps-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "google-maps", "name": "google-maps-mcp", "frandryName": "Google Maps Official", "category": "Mapping", diff --git a/grain-official/app.json b/grain-official/app.json index db58e9b5..19aa7258 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "grain", "name": "grain-mcp", "frandryName":"Grain Official", "category": "Collaboration", diff --git a/hubspot-official/app.json b/hubspot-official/app.json index 189e9dea..6a84a16b 100644 --- a/hubspot-official/app.json +++ b/hubspot-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "hubspot", "name": "hubspot-mcp", "frandryName": "HubSpot Official", "category": "CRM", diff --git a/indeed-official/app.json b/indeed-official/app.json index 83311cd6..7cee1431 100644 --- a/indeed-official/app.json +++ b/indeed-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "indeed", "name": "indeed-mcp", "frandryName": "Indeed Official", "category": "Job Board", diff --git a/jam-dev/app.json b/jam-dev/app.json index b4b7f717..bf9df501 100644 --- a/jam-dev/app.json +++ b/jam-dev/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "jam", "name": "jam-dev-mcp", "frandryName": "Jam Official", "category": "Software Development", diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json index 572d8ef7..fda8d7cb 100644 --- a/mercadolibre-official/app.json +++ b/mercadolibre-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "mercadolibre", "name": "mercadolibre-mcp", "frandryName": "Mercado Libre Official", "category": "E-Commerce", diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json index cfcb1577..462d18c9 100644 --- a/mercadopago-official/app.json +++ b/mercadopago-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "mercadopago", "name": "mercadopago-mcp", "frandryName": "Mercado Pago Official", "category": "Payments", diff --git a/vercel-official/app.json b/vercel-official/app.json index 6758e1e1..15370678 100644 --- a/vercel-official/app.json +++ b/vercel-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "vercel", "name": "vercel-mcp", "frandryName": "Vercel Official", "category": "Software Development", diff --git a/wix-official/app.json b/wix-official/app.json index 9a7dc76e..646bd4a4 100644 --- a/wix-official/app.json +++ b/wix-official/app.json @@ -1,5 +1,5 @@ { - "scopeName": "official", + "scopeName": "wix", "name": "wix-mcp", "frandryName": "Wix Official", "category": "CMS", From 18f690cf8015118d7c1d0bceaecfb56e266b1af2 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 20:19:26 -0300 Subject: [PATCH 10/31] refactor(app.json): Standardize scopeName and friendly_name across multiple applications - Updated scopeName to a more general identifier "cloudflare" for Cloudflare-related apps and "digitalocean" for DigitalOcean apps. - Changed frandryName to friendly_name for consistency in naming conventions across all app configurations, including Google services, Exa Search, HubSpot, and others. --- cloudflare-docs/app.json | 4 ++-- cloudflare-observability/app.json | 4 ++-- cloudflare-workers/app.json | 6 +++--- digitalocean-apps/app.json | 4 ++-- digitalocean-databases/app.json | 4 ++-- exa-search/app.json | 2 +- github-mcp-server/app.json | 2 +- google-bigquery-official/app.json | 4 ++-- google-gke-official/app.json | 4 ++-- google-maps-official/app.json | 4 ++-- grain-official/app.json | 2 +- hubspot-official/app.json | 2 +- indeed-official/app.json | 2 +- jam-dev/app.json | 2 +- mercadolibre-official/app.json | 2 +- mercadopago-official/app.json | 4 ++-- vercel-official/app.json | 2 +- wix-official/app.json | 2 +- 18 files changed, 28 insertions(+), 28 deletions(-) diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json index 1fd81df4..d4a65cbc 100644 --- a/cloudflare-docs/app.json +++ b/cloudflare-docs/app.json @@ -1,7 +1,7 @@ { - "scopeName": "cloudflare-docs", + "scopeName": "cloudflare", "name": "cloudflare-docs-mcp", - "frandryName": "Cloudflare Docs Official", + "friendly_name": "Cloudflare Docs Official", "category": "Documentation", "connection": { "type": "HTTP", diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json index a7c769ec..15d3ed2d 100644 --- a/cloudflare-observability/app.json +++ b/cloudflare-observability/app.json @@ -1,7 +1,7 @@ { - "scopeName": "cloudflare-observability", + "scopeName": "cloudflare", "name": "cloudflare-observability-mcp", - "frandryName": "Cloudflare Observability Official", + "friendly_name": "Cloudflare Observability Official", "category": "Observability", "connection": { "type": "HTTP", diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json index aab8aaf5..91b4e9c5 100644 --- a/cloudflare-workers/app.json +++ b/cloudflare-workers/app.json @@ -1,7 +1,7 @@ { - "scopeName": "cloudflare-workers", - "name": "cloudflare-workers-mcp", - "frandryName": "Cloudflare Workers Official", + "scopeName": "cloudflare", + "name": "cloudflare workers", + "friendly_name": "Cloudflare Workers Official", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json index 74e6f14b..e0f45655 100644 --- a/digitalocean-apps/app.json +++ b/digitalocean-apps/app.json @@ -1,7 +1,7 @@ { - "scopeName": "digitalocean-apps", + "scopeName": "digitalocean", "name": "digitalocean-apps-mcp", - "frandryName": "DigitalOcean Apps Official", + "friendly_name": "DigitalOcean Apps Official", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json index 0dd9beec..b4b54965 100644 --- a/digitalocean-databases/app.json +++ b/digitalocean-databases/app.json @@ -1,7 +1,7 @@ { - "scopeName": "digitalocean-databases", + "scopeName": "digitalocean", "name": "digitalocean-databases-mcp", - "frandryName": "DigitalOcean Databases Official", + "friendly_name": "DigitalOcean Databases Official", "category": "Database", "connection": { "type": "HTTP", diff --git a/exa-search/app.json b/exa-search/app.json index 4e0fa63c..3e8f0e15 100644 --- a/exa-search/app.json +++ b/exa-search/app.json @@ -1,7 +1,7 @@ { "scopeName": "exa-search", "name": "exa-search-mcp", - "frandryName": "Exa Search Official", + "friendly_name": "Exa Search Official", "category": "Search", "connection": { "type": "HTTP", diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json index ccd0fd5b..c9f55417 100644 --- a/github-mcp-server/app.json +++ b/github-mcp-server/app.json @@ -1,7 +1,7 @@ { "scopeName": "github", "name": "github-mcp-server", - "frandryName": "GitHub Official", + "friendly_name": "GitHub Official", "category": "Developer Tools", "connection": { "type": "HTTP", diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json index 2770472c..d60e9d40 100644 --- a/google-bigquery-official/app.json +++ b/google-bigquery-official/app.json @@ -1,7 +1,7 @@ { - "scopeName": "google-bigquery", + "scopeName": "google", "name": "google-bigquery-mcp", - "frandryName": "Google BigQuery Official", + "friendly_name": "Google BigQuery Official", "category": "Data Analysis", "connection": { "type": "HTTP", diff --git a/google-gke-official/app.json b/google-gke-official/app.json index e7efd90b..eea11792 100644 --- a/google-gke-official/app.json +++ b/google-gke-official/app.json @@ -1,7 +1,7 @@ { - "scopeName": "google-gke", + "scopeName": "google", "name": "google-gke-mcp", - "frandryName": "Google GKE Official", + "friendly_name": "Google GKE Official", "category": "Developer Tools", "connection": { "type": "HTTP", diff --git a/google-maps-official/app.json b/google-maps-official/app.json index 84ba9d3d..df9359a5 100644 --- a/google-maps-official/app.json +++ b/google-maps-official/app.json @@ -1,7 +1,7 @@ { - "scopeName": "google-maps", + "scopeName": "google", "name": "google-maps-mcp", - "frandryName": "Google Maps Official", + "friendly_name": "Google Maps Official", "category": "Mapping", "connection": { "type": "HTTP", diff --git a/grain-official/app.json b/grain-official/app.json index 19aa7258..c0704352 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "grain", "name": "grain-mcp", - "frandryName":"Grain Official", + "friendly_name": "Grain Official", "category": "Collaboration", "connection": { "type": "HTTP", diff --git a/hubspot-official/app.json b/hubspot-official/app.json index 6a84a16b..d04bd099 100644 --- a/hubspot-official/app.json +++ b/hubspot-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "hubspot", "name": "hubspot-mcp", - "frandryName": "HubSpot Official", + "friendly_name": "HubSpot Official", "category": "CRM", "connection": { "type": "HTTP", diff --git a/indeed-official/app.json b/indeed-official/app.json index 7cee1431..300a8434 100644 --- a/indeed-official/app.json +++ b/indeed-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "indeed", "name": "indeed-mcp", - "frandryName": "Indeed Official", + "friendly_name": "Indeed Official", "category": "Job Board", "connection": { "type": "HTTP", diff --git a/jam-dev/app.json b/jam-dev/app.json index bf9df501..effbc6d2 100644 --- a/jam-dev/app.json +++ b/jam-dev/app.json @@ -1,7 +1,7 @@ { "scopeName": "jam", "name": "jam-dev-mcp", - "frandryName": "Jam Official", + "friendly_name": "Jam Official", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json index fda8d7cb..378426c7 100644 --- a/mercadolibre-official/app.json +++ b/mercadolibre-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "mercadolibre", "name": "mercadolibre-mcp", - "frandryName": "Mercado Libre Official", + "friendly_name": "Mercado Libre Official", "category": "E-Commerce", "connection": { "type": "HTTP", diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json index 462d18c9..d84e46a6 100644 --- a/mercadopago-official/app.json +++ b/mercadopago-official/app.json @@ -1,7 +1,7 @@ { - "scopeName": "mercadopago", + "scopeName": "mercadolibre", "name": "mercadopago-mcp", - "frandryName": "Mercado Pago Official", + "friendly_name": "Mercado Pago Official", "category": "Payments", "connection": { "type": "HTTP", diff --git a/vercel-official/app.json b/vercel-official/app.json index 15370678..342817fd 100644 --- a/vercel-official/app.json +++ b/vercel-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "vercel", "name": "vercel-mcp", - "frandryName": "Vercel Official", + "friendly_name": "Vercel Official", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/wix-official/app.json b/wix-official/app.json index 646bd4a4..642f361c 100644 --- a/wix-official/app.json +++ b/wix-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "wix", "name": "wix-mcp", - "frandryName": "Wix Official", + "friendly_name": "Wix Official", "category": "CMS", "connection": { "type": "HTTP", From 1ac8ad5ef35bd3ad2bae5e27c10332ac32527456 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 20:27:40 -0300 Subject: [PATCH 11/31] refactor(app.json): Standardize friendlyName across multiple applications - Updated friendly_name to friendlyName for consistency in naming conventions across various app configurations, including Cloudflare, DigitalOcean, Google services, and others. --- cloudflare-docs/app.json | 2 +- cloudflare-observability/app.json | 2 +- cloudflare-workers/app.json | 2 +- digitalocean-apps/app.json | 2 +- digitalocean-databases/app.json | 2 +- exa-search/app.json | 2 +- github-mcp-server/app.json | 2 +- google-bigquery-official/app.json | 2 +- google-gke-official/app.json | 2 +- google-maps-official/app.json | 2 +- grain-official/app.json | 2 +- hubspot-official/app.json | 2 +- indeed-official/app.json | 2 +- jam-dev/app.json | 2 +- mercadolibre-official/app.json | 2 +- mercadopago-official/app.json | 2 +- vercel-official/app.json | 2 +- wix-official/app.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json index d4a65cbc..3dab7801 100644 --- a/cloudflare-docs/app.json +++ b/cloudflare-docs/app.json @@ -1,7 +1,7 @@ { "scopeName": "cloudflare", "name": "cloudflare-docs-mcp", - "friendly_name": "Cloudflare Docs Official", + "friendlyName": "Cloudflare Docs Official", "category": "Documentation", "connection": { "type": "HTTP", diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json index 15d3ed2d..687b220a 100644 --- a/cloudflare-observability/app.json +++ b/cloudflare-observability/app.json @@ -1,7 +1,7 @@ { "scopeName": "cloudflare", "name": "cloudflare-observability-mcp", - "friendly_name": "Cloudflare Observability Official", + "friendlyName": "Cloudflare Observability Official", "category": "Observability", "connection": { "type": "HTTP", diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json index 91b4e9c5..3d7047db 100644 --- a/cloudflare-workers/app.json +++ b/cloudflare-workers/app.json @@ -1,7 +1,7 @@ { "scopeName": "cloudflare", "name": "cloudflare workers", - "friendly_name": "Cloudflare Workers Official", + "friendlyName": "Cloudflare Workers Official", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json index e0f45655..e6e5d393 100644 --- a/digitalocean-apps/app.json +++ b/digitalocean-apps/app.json @@ -1,7 +1,7 @@ { "scopeName": "digitalocean", "name": "digitalocean-apps-mcp", - "friendly_name": "DigitalOcean Apps Official", + "friendlyName": "DigitalOcean Apps Official", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json index b4b54965..35bf3f91 100644 --- a/digitalocean-databases/app.json +++ b/digitalocean-databases/app.json @@ -1,7 +1,7 @@ { "scopeName": "digitalocean", "name": "digitalocean-databases-mcp", - "friendly_name": "DigitalOcean Databases Official", + "friendlyName": "DigitalOcean Databases Official", "category": "Database", "connection": { "type": "HTTP", diff --git a/exa-search/app.json b/exa-search/app.json index 3e8f0e15..3eb4a660 100644 --- a/exa-search/app.json +++ b/exa-search/app.json @@ -1,7 +1,7 @@ { "scopeName": "exa-search", "name": "exa-search-mcp", - "friendly_name": "Exa Search Official", + "friendlyName": "Exa Search Official", "category": "Search", "connection": { "type": "HTTP", diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json index c9f55417..95bf472f 100644 --- a/github-mcp-server/app.json +++ b/github-mcp-server/app.json @@ -1,7 +1,7 @@ { "scopeName": "github", "name": "github-mcp-server", - "friendly_name": "GitHub Official", + "friendlyName": "GitHub Official", "category": "Developer Tools", "connection": { "type": "HTTP", diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json index d60e9d40..ee582eec 100644 --- a/google-bigquery-official/app.json +++ b/google-bigquery-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "google", "name": "google-bigquery-mcp", - "friendly_name": "Google BigQuery Official", + "friendlyName": "Google BigQuery Official", "category": "Data Analysis", "connection": { "type": "HTTP", diff --git a/google-gke-official/app.json b/google-gke-official/app.json index eea11792..d0768510 100644 --- a/google-gke-official/app.json +++ b/google-gke-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "google", "name": "google-gke-mcp", - "friendly_name": "Google GKE Official", + "friendlyName": "Google GKE Official", "category": "Developer Tools", "connection": { "type": "HTTP", diff --git a/google-maps-official/app.json b/google-maps-official/app.json index df9359a5..bcbd5562 100644 --- a/google-maps-official/app.json +++ b/google-maps-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "google", "name": "google-maps-mcp", - "friendly_name": "Google Maps Official", + "friendlyName": "Google Maps Official", "category": "Mapping", "connection": { "type": "HTTP", diff --git a/grain-official/app.json b/grain-official/app.json index c0704352..ee790cba 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "grain", "name": "grain-mcp", - "friendly_name": "Grain Official", + "friendlyName": "Grain Official", "category": "Collaboration", "connection": { "type": "HTTP", diff --git a/hubspot-official/app.json b/hubspot-official/app.json index d04bd099..07736f2a 100644 --- a/hubspot-official/app.json +++ b/hubspot-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "hubspot", "name": "hubspot-mcp", - "friendly_name": "HubSpot Official", + "friendlyName": "HubSpot Official", "category": "CRM", "connection": { "type": "HTTP", diff --git a/indeed-official/app.json b/indeed-official/app.json index 300a8434..2da1e6ef 100644 --- a/indeed-official/app.json +++ b/indeed-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "indeed", "name": "indeed-mcp", - "friendly_name": "Indeed Official", + "friendlyName": "Indeed Official", "category": "Job Board", "connection": { "type": "HTTP", diff --git a/jam-dev/app.json b/jam-dev/app.json index effbc6d2..566d6c47 100644 --- a/jam-dev/app.json +++ b/jam-dev/app.json @@ -1,7 +1,7 @@ { "scopeName": "jam", "name": "jam-dev-mcp", - "friendly_name": "Jam Official", + "friendlyName": "Jam Official", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json index 378426c7..bf6d029a 100644 --- a/mercadolibre-official/app.json +++ b/mercadolibre-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "mercadolibre", "name": "mercadolibre-mcp", - "friendly_name": "Mercado Libre Official", + "friendlyName": "Mercado Libre Official", "category": "E-Commerce", "connection": { "type": "HTTP", diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json index d84e46a6..c51caadf 100644 --- a/mercadopago-official/app.json +++ b/mercadopago-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "mercadolibre", "name": "mercadopago-mcp", - "friendly_name": "Mercado Pago Official", + "friendlyName": "Mercado Pago Official", "category": "Payments", "connection": { "type": "HTTP", diff --git a/vercel-official/app.json b/vercel-official/app.json index 342817fd..7dd75a7c 100644 --- a/vercel-official/app.json +++ b/vercel-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "vercel", "name": "vercel-mcp", - "friendly_name": "Vercel Official", + "friendlyName": "Vercel Official", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/wix-official/app.json b/wix-official/app.json index 642f361c..f3105cfe 100644 --- a/wix-official/app.json +++ b/wix-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "wix", "name": "wix-mcp", - "friendly_name": "Wix Official", + "friendlyName": "Wix Official", "category": "CMS", "connection": { "type": "HTTP", From af917ef7dd6b778b0cd67fb6b7988cef976cb460 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 20:31:49 -0300 Subject: [PATCH 12/31] refactor(app.json): Simplify friendlyName for multiple applications - Updated friendlyName for various applications to remove "Official" from the name, enhancing clarity and consistency across Cloudflare, DigitalOcean, Google, Exa Search, HubSpot, and others. --- cloudflare-docs/app.json | 2 +- cloudflare-observability/app.json | 2 +- cloudflare-workers/app.json | 2 +- digitalocean-apps/app.json | 2 +- digitalocean-databases/app.json | 2 +- exa-search/app.json | 2 +- github-mcp-server/app.json | 2 +- google-bigquery-official/app.json | 2 +- google-gke-official/app.json | 2 +- google-maps-official/app.json | 2 +- grain-official/app.json | 2 +- hubspot-official/app.json | 2 +- indeed-official/app.json | 2 +- jam-dev/app.json | 2 +- mercadolibre-official/app.json | 2 +- mercadopago-official/app.json | 2 +- vercel-official/app.json | 2 +- wix-official/app.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json index 3dab7801..59cd23ce 100644 --- a/cloudflare-docs/app.json +++ b/cloudflare-docs/app.json @@ -1,7 +1,7 @@ { "scopeName": "cloudflare", "name": "cloudflare-docs-mcp", - "friendlyName": "Cloudflare Docs Official", + "friendlyName": "Cloudflare Docs", "category": "Documentation", "connection": { "type": "HTTP", diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json index 687b220a..cca4cd4a 100644 --- a/cloudflare-observability/app.json +++ b/cloudflare-observability/app.json @@ -1,7 +1,7 @@ { "scopeName": "cloudflare", "name": "cloudflare-observability-mcp", - "friendlyName": "Cloudflare Observability Official", + "friendlyName": "Cloudflare Observability", "category": "Observability", "connection": { "type": "HTTP", diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json index 3d7047db..09105d97 100644 --- a/cloudflare-workers/app.json +++ b/cloudflare-workers/app.json @@ -1,7 +1,7 @@ { "scopeName": "cloudflare", "name": "cloudflare workers", - "friendlyName": "Cloudflare Workers Official", + "friendlyName": "Cloudflare Workers", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json index e6e5d393..d431bac8 100644 --- a/digitalocean-apps/app.json +++ b/digitalocean-apps/app.json @@ -1,7 +1,7 @@ { "scopeName": "digitalocean", "name": "digitalocean-apps-mcp", - "friendlyName": "DigitalOcean Apps Official", + "friendlyName": "DigitalOcean Apps", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json index 35bf3f91..3bbf6b94 100644 --- a/digitalocean-databases/app.json +++ b/digitalocean-databases/app.json @@ -1,7 +1,7 @@ { "scopeName": "digitalocean", "name": "digitalocean-databases-mcp", - "friendlyName": "DigitalOcean Databases Official", + "friendlyName": "DigitalOcean Databases", "category": "Database", "connection": { "type": "HTTP", diff --git a/exa-search/app.json b/exa-search/app.json index 3eb4a660..01a5f97d 100644 --- a/exa-search/app.json +++ b/exa-search/app.json @@ -1,7 +1,7 @@ { "scopeName": "exa-search", "name": "exa-search-mcp", - "friendlyName": "Exa Search Official", + "friendlyName": "Exa Search", "category": "Search", "connection": { "type": "HTTP", diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json index 95bf472f..8aa17612 100644 --- a/github-mcp-server/app.json +++ b/github-mcp-server/app.json @@ -1,7 +1,7 @@ { "scopeName": "github", "name": "github-mcp-server", - "friendlyName": "GitHub Official", + "friendlyName": "GitHub", "category": "Developer Tools", "connection": { "type": "HTTP", diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json index ee582eec..e5e7d904 100644 --- a/google-bigquery-official/app.json +++ b/google-bigquery-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "google", "name": "google-bigquery-mcp", - "friendlyName": "Google BigQuery Official", + "friendlyName": "Google BigQuery", "category": "Data Analysis", "connection": { "type": "HTTP", diff --git a/google-gke-official/app.json b/google-gke-official/app.json index d0768510..b7646c60 100644 --- a/google-gke-official/app.json +++ b/google-gke-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "google", "name": "google-gke-mcp", - "friendlyName": "Google GKE Official", + "friendlyName": "Google GKE", "category": "Developer Tools", "connection": { "type": "HTTP", diff --git a/google-maps-official/app.json b/google-maps-official/app.json index bcbd5562..5ea5f9c8 100644 --- a/google-maps-official/app.json +++ b/google-maps-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "google", "name": "google-maps-mcp", - "friendlyName": "Google Maps Official", + "friendlyName": "Google Maps", "category": "Mapping", "connection": { "type": "HTTP", diff --git a/grain-official/app.json b/grain-official/app.json index ee790cba..00c13fd9 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "grain", "name": "grain-mcp", - "friendlyName": "Grain Official", + "friendlyName": "Grain", "category": "Collaboration", "connection": { "type": "HTTP", diff --git a/hubspot-official/app.json b/hubspot-official/app.json index 07736f2a..a9fa12ed 100644 --- a/hubspot-official/app.json +++ b/hubspot-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "hubspot", "name": "hubspot-mcp", - "friendlyName": "HubSpot Official", + "friendlyName": "HubSpot", "category": "CRM", "connection": { "type": "HTTP", diff --git a/indeed-official/app.json b/indeed-official/app.json index 2da1e6ef..b2301136 100644 --- a/indeed-official/app.json +++ b/indeed-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "indeed", "name": "indeed-mcp", - "friendlyName": "Indeed Official", + "friendlyName": "Indeed", "category": "Job Board", "connection": { "type": "HTTP", diff --git a/jam-dev/app.json b/jam-dev/app.json index 566d6c47..cdaa54c3 100644 --- a/jam-dev/app.json +++ b/jam-dev/app.json @@ -1,7 +1,7 @@ { "scopeName": "jam", "name": "jam-dev-mcp", - "friendlyName": "Jam Official", + "friendlyName": "Jam", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json index bf6d029a..13b3b811 100644 --- a/mercadolibre-official/app.json +++ b/mercadolibre-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "mercadolibre", "name": "mercadolibre-mcp", - "friendlyName": "Mercado Libre Official", + "friendlyName": "Mercado Libre", "category": "E-Commerce", "connection": { "type": "HTTP", diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json index c51caadf..adeb6a4f 100644 --- a/mercadopago-official/app.json +++ b/mercadopago-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "mercadolibre", "name": "mercadopago-mcp", - "friendlyName": "Mercado Pago Official", + "friendlyName": "Mercado Pago", "category": "Payments", "connection": { "type": "HTTP", diff --git a/vercel-official/app.json b/vercel-official/app.json index 7dd75a7c..e408fec5 100644 --- a/vercel-official/app.json +++ b/vercel-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "vercel", "name": "vercel-mcp", - "friendlyName": "Vercel Official", + "friendlyName": "Vercel", "category": "Software Development", "connection": { "type": "HTTP", diff --git a/wix-official/app.json b/wix-official/app.json index f3105cfe..8e3547db 100644 --- a/wix-official/app.json +++ b/wix-official/app.json @@ -1,7 +1,7 @@ { "scopeName": "wix", "name": "wix-mcp", - "friendlyName": "Wix Official", + "friendlyName": "Wix", "category": "CMS", "connection": { "type": "HTTP", From d26845f3dcd16e97b9f363c605ff5f6439b9b135 Mon Sep 17 00:00:00 2001 From: pedrofrxncx Date: Thu, 8 Jan 2026 20:55:16 -0300 Subject: [PATCH 13/31] try --- bun.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bun.lock b/bun.lock index 0330dce4..7e1f1f91 100644 --- a/bun.lock +++ b/bun.lock @@ -741,7 +741,7 @@ "@decocms/mcps-shared": ["@decocms/mcps-shared@workspace:shared"], - "@decocms/runtime": ["@decocms/runtime@1.1.2", "", { "dependencies": { "@ai-sdk/provider": "^3.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "^1.0.7", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-yReIcawmbUJ1wAtJo0SlU0gFj+y2jYC3XXz6iIVG0e6pIHyvIz8WodbRnxNAVXn1YQNroZedrUanqpGgJOOFtw=="], + "@decocms/runtime": ["@decocms/runtime@1.1.3", "", { "dependencies": { "@ai-sdk/provider": "^3.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "^1.0.7", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-pj6OccmpWulMjyOt9FHTNX41xHk800uzhmoYK/xq9h1f+DfDBMqyOZnt70Zmwrab7dMDO2w3VQD+NlgFKtrw1w=="], "@decocms/vite-plugin": ["@decocms/vite-plugin@1.0.0-alpha.1", "", { "dependencies": { "@cloudflare/vite-plugin": "^1.13.4", "vite": "7.2.0" } }, "sha512-DI9zNH49pVk8aQ+7rNYwqTZhjQ4RZDA+kA1t3ifwc4RLJsOtYv8LOXERRZnou7CcKVTdXPB06M8gbMWPpSaq8w=="], @@ -1455,15 +1455,15 @@ "@tanstack/react-query": ["@tanstack/react-query@5.90.16", "", { "dependencies": { "@tanstack/query-core": "5.90.16" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ=="], - "@tanstack/react-router": ["@tanstack/react-router@1.146.0", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/react-store": "^0.8.0", "@tanstack/router-core": "1.146.0", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-aak4/TZrBKS0v74eZmvVsJheXpl0M4LLOBTwVZpiMxbIjbGQMCiHNHqoxW2EpnJBag0OGDHFX6NAsgzf0KGHUQ=="], + "@tanstack/react-router": ["@tanstack/react-router@1.146.2", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/react-store": "^0.8.0", "@tanstack/router-core": "1.146.2", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-Oq/shGk5nCNyK/YhB9SGByeU3wgjNVzpGoDovuOvIacE9hsicZYOv9EnII1fEku8xavqWtN8D9wr21z2CDanjA=="], - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.146.0", "", { "dependencies": { "@tanstack/router-devtools-core": "1.146.0" }, "peerDependencies": { "@tanstack/react-router": "^1.146.0", "@tanstack/router-core": "^1.146.0", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-FgE7opBF2pwiGY6E/+zKa5RgSPHyhubziO+Qy6Lw0lJv8o2tz+OO4ub+UVQzz86oQXWKx/NJilQ0Fx9KDz6Q8g=="], + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.146.2", "", { "dependencies": { "@tanstack/router-devtools-core": "1.146.2" }, "peerDependencies": { "@tanstack/react-router": "^1.146.2", "@tanstack/router-core": "^1.146.2", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-svUw0KM9e4SjpFtsNfYsFO5y9KqfZIc7r5cTdsfletx/gOb7cF3bekPPx/JUiAu2RU7vME9R8Rs1hlJ9kraJXA=="], "@tanstack/react-store": ["@tanstack/react-store@0.8.0", "", { "dependencies": { "@tanstack/store": "0.8.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow=="], - "@tanstack/router-core": ["@tanstack/router-core@1.146.0", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/store": "^0.8.0", "cookie-es": "^2.0.0", "seroval": "^1.4.1", "seroval-plugins": "^1.4.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-9AcXViVE4NiKTwaxLhqKbzS1gUqu1ymTmy5TjyEthfYQXGdJWZZnCwj68xc8IpsG/CK8kaa6T1qa4xhLuYZG3g=="], + "@tanstack/router-core": ["@tanstack/router-core@1.146.2", "", { "dependencies": { "@tanstack/history": "1.145.7", "@tanstack/store": "^0.8.0", "cookie-es": "^2.0.0", "seroval": "^1.4.1", "seroval-plugins": "^1.4.0", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-MmTDiT6fpe+WBWYAuhp8oyzULBJX4oblm1kCqHDngf9mK3qcnNm5nkKk4d3Fk80QZmHS4DcRNFaFHKbLUVlZog=="], - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.146.0", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@tanstack/router-core": "^1.146.0", "csstype": "^3.0.10", "solid-js": ">=1.9.5" }, "optionalPeers": ["csstype"] }, "sha512-AOFr2YvqtZ+rr4yxrwSmlz9hO58aFgm1Tzr1QH554Rxq7wPH2N1CJYaCj+NvX1urrEyz+cf/CsWo0JUFPTxfVQ=="], + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.146.2", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@tanstack/router-core": "^1.146.2", "csstype": "^3.0.10", "solid-js": ">=1.9.5" }, "optionalPeers": ["csstype"] }, "sha512-rIo5TEyM6uex1Zr0kHtBZu9Mwo0Aj2A84hk+UaLIBLCRpqaen6tuzjxmgNDSZ4YrgZOmixfowLObdlsuMyXTsQ=="], "@tanstack/store": ["@tanstack/store@0.8.0", "", {}, "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ=="], From c477dbdf9390c1da0d586bbcc08263fcdd0805f9 Mon Sep 17 00:00:00 2001 From: pedrofrxncx Date: Thu, 8 Jan 2026 20:58:59 -0300 Subject: [PATCH 14/31] bump --- bun.lock | 16 ++++++++++++++-- mcp-studio/package.json | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 7e1f1f91..6694d06d 100644 --- a/bun.lock +++ b/bun.lock @@ -162,7 +162,7 @@ "version": "1.0.0", "dependencies": { "@ai-sdk/mcp": "^1.0.1", - "@decocms/bindings": "^1.0.7", + "@decocms/bindings": "^1.0.8", "@decocms/runtime": "^1.1.2", "@jitl/quickjs-singlefile-cjs-release-sync": "^0.31.0", "@modelcontextprotocol/sdk": "^1.25.1", @@ -737,7 +737,7 @@ "@deco/mcp": ["@jsr/deco__mcp@0.5.5", "https://npm.jsr.io/~/11/@jsr/deco__mcp/0.5.5.tgz", { "dependencies": { "@jsr/deco__deco": "^1.112.1", "@jsr/hono__hono": "^4.5.4", "@modelcontextprotocol/sdk": "^1.11.4", "fetch-to-node": "^2.1.0", "zod": "^3.24.2" } }, "sha512-46TaWGu7lbsPleHjCVrG6afhQjv3muBTNRFBkIhLrSzlQ+9d21UeukpYs19z0AGpOlmjSSK9qIRFTf8SlH2B6Q=="], - "@decocms/bindings": ["@decocms/bindings@1.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-NPYv4+VpI6XQbfMewy307Q1jp9QZc8a6lsC2g9Z/DCewKqFOCqAKsRrhBSGaujKEzHqxNLSqXhFx8/Vn3ODVJA=="], + "@decocms/bindings": ["@decocms/bindings@1.0.8", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-DDF4rA/+L8ELUyrMNxDc5MCBtLPXCkA45OWi85xG3XX5a+DqZ7+GJtVQBmyMbEc+02km/oKUgN5IS1ebnAMLlA=="], "@decocms/mcps-shared": ["@decocms/mcps-shared@workspace:shared"], @@ -2541,6 +2541,8 @@ "@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], + "@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-NPYv4+VpI6XQbfMewy307Q1jp9QZc8a6lsC2g9Z/DCewKqFOCqAKsRrhBSGaujKEzHqxNLSqXhFx8/Vn3ODVJA=="], + "@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -2863,6 +2865,8 @@ "object-storage/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "openrouter/@decocms/bindings": ["@decocms/bindings@1.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-NPYv4+VpI6XQbfMewy307Q1jp9QZc8a6lsC2g9Z/DCewKqFOCqAKsRrhBSGaujKEzHqxNLSqXhFx8/Vn3ODVJA=="], + "openrouter/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "ora/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -2893,6 +2897,8 @@ "reddit/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "registry/@decocms/bindings": ["@decocms/bindings@1.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-NPYv4+VpI6XQbfMewy307Q1jp9QZc8a6lsC2g9Z/DCewKqFOCqAKsRrhBSGaujKEzHqxNLSqXhFx8/Vn3ODVJA=="], + "registry/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "registry/@types/node": ["@types/node@22.19.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], @@ -2977,6 +2983,8 @@ "@decocms/bindings/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "@decocms/runtime/@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], + "@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], @@ -3173,6 +3181,8 @@ "object-storage/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "openrouter/@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], + "openrouter/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ora/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -3199,6 +3209,8 @@ "reddit/deco-cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "registry/@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], + "registry/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "registry/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], diff --git a/mcp-studio/package.json b/mcp-studio/package.json index 8c8aa5a7..00ecc3b8 100644 --- a/mcp-studio/package.json +++ b/mcp-studio/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@ai-sdk/mcp": "^1.0.1", - "@decocms/bindings": "^1.0.7", + "@decocms/bindings": "^1.0.8", "@decocms/runtime": "^1.1.2", "@jitl/quickjs-singlefile-cjs-release-sync": "^0.31.0", "@modelcontextprotocol/sdk": "^1.25.1", From 9d0ad2129c1ee25f7193b088f23b33af2cd61eae Mon Sep 17 00:00:00 2001 From: pedrofrxncx Date: Thu, 8 Jan 2026 21:04:12 -0300 Subject: [PATCH 15/31] pls --- bun.lock | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/bun.lock b/bun.lock index 6694d06d..0586c7c9 100644 --- a/bun.lock +++ b/bun.lock @@ -1533,7 +1533,7 @@ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], - "@types/send": ["@types/send@1.2.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="], + "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="], @@ -2531,8 +2531,6 @@ "@deco-cx/warp-node/undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], - "@deco-cx/warp-node/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - "@deco/mcp/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], "@deco/mcp/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -2541,8 +2539,6 @@ "@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], - "@decocms/runtime/@decocms/bindings": ["@decocms/bindings@1.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-NPYv4+VpI6XQbfMewy307Q1jp9QZc8a6lsC2g9Z/DCewKqFOCqAKsRrhBSGaujKEzHqxNLSqXhFx8/Vn3ODVJA=="], - "@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], @@ -2761,8 +2757,6 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@types/serve-static/@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], - "ai-v5/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.12", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@vercel/oidc": "3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W+cB1sOWvPcz9qiIsNtD+HxUrBUva2vWv2K1EFukuImX+HA0uZx3EyyOjhYQ9gtf/teqEG80M6OvJ7xx/VLV2A=="], "ai-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], @@ -2865,8 +2859,6 @@ "object-storage/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "openrouter/@decocms/bindings": ["@decocms/bindings@1.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-NPYv4+VpI6XQbfMewy307Q1jp9QZc8a6lsC2g9Z/DCewKqFOCqAKsRrhBSGaujKEzHqxNLSqXhFx8/Vn3ODVJA=="], - "openrouter/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "ora/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -2897,8 +2889,6 @@ "reddit/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "registry/@decocms/bindings": ["@decocms/bindings@1.0.7", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.25.1", "zod": "^4.0.0", "zod-from-json-schema": "^0.5.2" } }, "sha512-NPYv4+VpI6XQbfMewy307Q1jp9QZc8a6lsC2g9Z/DCewKqFOCqAKsRrhBSGaujKEzHqxNLSqXhFx8/Vn3ODVJA=="], - "registry/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "registry/@types/node": ["@types/node@22.19.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], @@ -2983,8 +2973,6 @@ "@decocms/bindings/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "@decocms/runtime/@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], - "@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], @@ -3083,8 +3071,6 @@ "content-scraper/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], - "content-scraper/deco-cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - "content-scraper/deco-cli/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "data-for-seo/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], @@ -3181,8 +3167,6 @@ "object-storage/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], - "openrouter/@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], - "openrouter/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ora/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -3207,10 +3191,6 @@ "reddit/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], - "reddit/deco-cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - - "registry/@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], - "registry/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "registry/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], @@ -3859,6 +3839,8 @@ "apify/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4265,6 +4247,8 @@ "reddit/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], + "reddit/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], From d1d02f2d59ed4ec1756ce7bfae8bd14337305e37 Mon Sep 17 00:00:00 2001 From: pedrofrxncx Date: Thu, 8 Jan 2026 21:10:19 -0300 Subject: [PATCH 16/31] add ts-morph --- bun.lock | 19 ++++++++++++++++--- mcp-studio/package.json | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 0586c7c9..585620cf 100644 --- a/bun.lock +++ b/bun.lock @@ -188,6 +188,7 @@ "tailwind-merge": "^3.0.2", "tailwindcss": "^4.0.6", "tailwindcss-animate": "^1.0.7", + "ts-morph": "^27.0.2", "zod": "^4.0.0", }, "devDependencies": { @@ -855,6 +856,10 @@ "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="], + "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], + + "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], @@ -1467,7 +1472,7 @@ "@tanstack/store": ["@tanstack/store@0.8.0", "", {}, "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ=="], - "@ts-morph/common": ["@ts-morph/common@0.22.0", "", { "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.3", "mkdirp": "^3.0.1", "path-browserify": "^1.0.1" } }, "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw=="], + "@ts-morph/common": ["@ts-morph/common@0.28.1", "", { "dependencies": { "minimatch": "^10.0.1", "path-browserify": "^1.0.1", "tinyglobby": "^0.2.14" } }, "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g=="], "@types/aws-lambda": ["@types/aws-lambda@8.10.152", "", {}, "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw=="], @@ -1653,7 +1658,7 @@ "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], - "code-block-writer": ["code-block-writer@12.0.0", "", {}, "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w=="], + "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="], "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], @@ -2377,7 +2382,7 @@ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], - "ts-morph": ["ts-morph@21.0.1", "", { "dependencies": { "@ts-morph/common": "~0.22.0", "code-block-writer": "^12.0.0" } }, "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg=="], + "ts-morph": ["ts-morph@27.0.2", "", { "dependencies": { "@ts-morph/common": "~0.28.1", "code-block-writer": "^13.0.3" } }, "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -2555,6 +2560,8 @@ "@jsr/deco__codemod-toolkit/@jsr/std__semver": ["@jsr/std__semver@1.0.7", "https://npm.jsr.io/~/11/@jsr/std__semver/1.0.7.tgz", {}, "sha512-/WpDSNegE6lI50L1+VnItLkuuQlZK8e8QbxrjV1sH+3YqiH+sQ/Tx3yYvewkKVVSwcidQUlqSIHSPrhay1zLCg=="], + "@jsr/deco__codemod-toolkit/ts-morph": ["ts-morph@21.0.1", "", { "dependencies": { "@ts-morph/common": "~0.22.0", "code-block-writer": "^12.0.0" } }, "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg=="], + "@jsr/deco__deco/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.52.1", "", { "dependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A=="], "@jsr/deco__deco/@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/sdk-logs": "0.52.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA=="], @@ -2757,6 +2764,8 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@ts-morph/common/minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="], + "ai-v5/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.12", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@vercel/oidc": "3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W+cB1sOWvPcz9qiIsNtD+HxUrBUva2vWv2K1EFukuImX+HA0uZx3EyyOjhYQ9gtf/teqEG80M6OvJ7xx/VLV2A=="], "ai-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], @@ -2981,6 +2990,10 @@ "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "@jsr/deco__codemod-toolkit/ts-morph/@ts-morph/common": ["@ts-morph/common@0.22.0", "", { "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.3", "mkdirp": "^3.0.1", "path-browserify": "^1.0.1" } }, "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw=="], + + "@jsr/deco__codemod-toolkit/ts-morph/code-block-writer": ["code-block-writer@12.0.0", "", {}, "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w=="], + "@jsr/deco__deco/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], "@jsr/deco__deco/@opentelemetry/exporter-logs-otlp-http/@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-logs": "0.52.1", "@opentelemetry/sdk-metrics": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg=="], diff --git a/mcp-studio/package.json b/mcp-studio/package.json index 00ecc3b8..de4c86a2 100644 --- a/mcp-studio/package.json +++ b/mcp-studio/package.json @@ -41,6 +41,7 @@ "tailwind-merge": "^3.0.2", "tailwindcss": "^4.0.6", "tailwindcss-animate": "^1.0.7", + "ts-morph": "^27.0.2", "zod": "^4.0.0" }, "devDependencies": { From 34db21e762c2ea3f05d66ebf9a4a75e25fdd5baa Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Thu, 8 Jan 2026 21:17:49 -0300 Subject: [PATCH 17/31] Redeploy --- google-big-query/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-big-query/.gitignore b/google-big-query/.gitignore index e091e2b0..d68737e3 100644 --- a/google-big-query/.gitignore +++ b/google-big-query/.gitignore @@ -1,4 +1,4 @@ -dist/ +dist/ node_modules/ .env .dev.vars From 5b6cb084cf6e9c77b0faecc213cc22032ab8011f Mon Sep 17 00:00:00 2001 From: Marcos Candeia Date: Thu, 8 Jan 2026 22:01:21 -0300 Subject: [PATCH 18/31] Adds deco llm binding (#107) * Adds deco llm binding Signed-off-by: Marcos Candeia * Rebase Signed-off-by: Marcos Candeia --------- Signed-off-by: Marcos Candeia --- bun.lock | 356 ++++++++++----------- content-scraper/package.json | 2 +- deco-llm/.gitignore | 1 + deco-llm/app.json | 11 + deco-llm/package.json | 40 +++ deco-llm/server/main.ts | 104 ++++++ deco-llm/server/usage.ts | 44 +++ deco-llm/tsconfig.json | 42 +++ google-calendar/package.json | 2 +- google-tag-manager/package.json | 2 +- mcp-studio/package.json | 2 +- mcp-studio/server/types/env.ts | 80 +---- meta-ads/package.json | 2 +- openrouter/package.json | 9 +- openrouter/server/lib/env.ts | 3 +- openrouter/server/lib/openrouter-client.ts | 6 + openrouter/server/main.ts | 11 +- openrouter/server/tools/hooks.ts | 16 + openrouter/server/tools/index.ts | 37 ++- openrouter/server/tools/llm-binding.ts | 29 +- package.json | 3 +- registry/package.json | 2 +- shared/package.json | 6 +- shared/registry.ts | 99 ++++++ 24 files changed, 606 insertions(+), 303 deletions(-) create mode 100644 deco-llm/.gitignore create mode 100644 deco-llm/app.json create mode 100644 deco-llm/package.json create mode 100644 deco-llm/server/main.ts create mode 100644 deco-llm/server/usage.ts create mode 100644 deco-llm/tsconfig.json create mode 100644 openrouter/server/tools/hooks.ts create mode 100644 shared/registry.ts diff --git a/bun.lock b/bun.lock index 585620cf..7877e233 100644 --- a/bun.lock +++ b/bun.lock @@ -38,7 +38,7 @@ "name": "content-scraper", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "@supabase/supabase-js": "^2.49.0", "zod": "^4.0.0", }, @@ -95,6 +95,33 @@ "wrangler": "^4.28.0", }, }, + "deco-llm": { + "name": "deco-llm", + "version": "1.0.0", + "dependencies": { + "@ai-sdk/provider": "^3.0.2", + "@ai-sdk/provider-utils": "^4.0.4", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", + "@openrouter/ai-sdk-provider": "^1.5.4", + "@openrouter/sdk": "^0.3.11", + "ai": "^6.0.3", + "zod": "^4.0.0", + }, + "devDependencies": { + "@cloudflare/vite-plugin": "^1.13.4", + "@cloudflare/workers-types": "^4.20251014.0", + "@decocms/mcps-shared": "1.0.0", + "@decocms/openrouter": "1.0.0", + "@mastra/core": "^0.24.0", + "@modelcontextprotocol/sdk": "1.25.1", + "@types/mime-db": "^1.43.6", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2", + "vite": "7.2.0", + "wrangler": "^4.28.0", + }, + }, "gemini-pro-vision": { "name": "gemini-pro-vision", "version": "1.0.0", @@ -133,7 +160,7 @@ "name": "google-calendar", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0", }, "devDependencies": { @@ -147,7 +174,7 @@ "name": "google-tag-manager", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0", }, "devDependencies": { @@ -163,7 +190,7 @@ "dependencies": { "@ai-sdk/mcp": "^1.0.1", "@decocms/bindings": "^1.0.8", - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "@jitl/quickjs-singlefile-cjs-release-sync": "^0.31.0", "@modelcontextprotocol/sdk": "^1.25.1", "@radix-ui/react-collapsible": "^1.1.12", @@ -201,7 +228,7 @@ "name": "meta-ads", "version": "1.0.0", "dependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0", }, "devDependencies": { @@ -275,13 +302,13 @@ }, }, "openrouter": { - "name": "openrouter", + "name": "@decocms/openrouter", "version": "1.0.0", "dependencies": { "@ai-sdk/provider": "^3.0.2", "@ai-sdk/provider-utils": "^4.0.4", "@decocms/bindings": "^1.0.7", - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "@openrouter/ai-sdk-provider": "^1.5.4", "@openrouter/sdk": "^0.3.11", "ai": "^6.0.3", @@ -387,7 +414,7 @@ "version": "1.0.0", "dependencies": { "@decocms/bindings": "^1.0.4", - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "@supabase/supabase-js": "^2.89.0", "zod": "^4.0.0", }, @@ -427,7 +454,8 @@ "name": "@decocms/mcps-shared", "version": "1.0.0", "devDependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", "@types/bun": "^1.2.14", "vite": "7.2.0", "zod": "^4.0.0", @@ -730,7 +758,7 @@ "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260107.1", "", { "os": "win32", "cpu": "x64" }, "sha512-gmBMqs606Gd/IhBEBPSL/hJAqy2L8IyPUjKtoqd/Ccy7GQxbSc0rYlRkxbQ9YzmqnuhrTVYvXuLscyWrpmAJkw=="], - "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260108.0", "", {}, "sha512-0SuzZ7SeMB35X0wL2rhsEQG1dmfAGY8N8z7UwrkFb6hxerxwXP4QuIzcF8HtCJTRTjChmarxV+HQC+ADB4UK1A=="], + "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260109.0", "", {}, "sha512-90vx2lVm+fhQyE8FKqNhT8JBI8GuY0biAwxTzvzeRIdWVo2ArCpUfYMYq4kzaGTfA6NwCmXmBFSgnqfG6OFxLw=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], @@ -742,6 +770,8 @@ "@decocms/mcps-shared": ["@decocms/mcps-shared@workspace:shared"], + "@decocms/openrouter": ["@decocms/openrouter@workspace:openrouter"], + "@decocms/runtime": ["@decocms/runtime@1.1.3", "", { "dependencies": { "@ai-sdk/provider": "^3.0.0", "@cloudflare/workers-types": "^4.20250617.0", "@decocms/bindings": "^1.0.7", "@modelcontextprotocol/sdk": "1.25.1", "hono": "^4.10.7", "jose": "^6.0.11", "zod": "^4.0.0" } }, "sha512-pj6OccmpWulMjyOt9FHTNX41xHk800uzhmoYK/xq9h1f+DfDBMqyOZnt70Zmwrab7dMDO2w3VQD+NlgFKtrw1w=="], "@decocms/vite-plugin": ["@decocms/vite-plugin@1.0.0-alpha.1", "", { "dependencies": { "@cloudflare/vite-plugin": "^1.13.4", "vite": "7.2.0" } }, "sha512-DI9zNH49pVk8aQ+7rNYwqTZhjQ4RZDA+kA1t3ifwc4RLJsOtYv8LOXERRZnou7CcKVTdXPB06M8gbMWPpSaq8w=="], @@ -962,7 +992,7 @@ "@mastra/schema-compat": ["@mastra/schema-compat@0.11.9", "", { "dependencies": { "json-schema": "^0.4.0", "json-schema-to-zod": "^2.7.0", "zod-from-json-schema": "^0.5.0", "zod-from-json-schema-v3": "npm:zod-from-json-schema@^0.0.5", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "ai": "^4.0.0 || ^5.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-LXEChx5n3bcuSFWQ5Wn9K2spLEpzHGf+DCnAeryuecpOo8VGLJ2QCK9Ugsnfjuc6hC0Ha73HvL1AD8zDhjmYOg=="], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -1538,7 +1568,7 @@ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], - "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], + "@types/send": ["@types/send@1.2.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="], "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="], @@ -1570,7 +1600,7 @@ "ai-v5": ["ai@5.0.97", "", { "dependencies": { "@ai-sdk/gateway": "2.0.12", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8zBx0b/owis4eJI2tAlV8a1Rv0BANmLxontcAelkLNwEHhgfgXeKpDkhNB6OgV+BJSwboIUDkgd9312DdJnCOQ=="], - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], @@ -1708,6 +1738,8 @@ "deco-cli": ["deco-cli@0.28.6", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "1.25.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-IwdfHoZfrLVGTVULBJ2NRjEkD9dZafJSf3qYsZeer7CR5owQ1XLnDAKIwd/c6iwLZB6+2zrMjL4RNWhF2SzZbw=="], + "deco-llm": ["deco-llm@workspace:deco-llm"], + "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], @@ -1966,7 +1998,7 @@ "json-schema-to-zod": ["json-schema-to-zod@2.7.0", "", { "bin": { "json-schema-to-zod": "dist/cjs/cli.js" } }, "sha512-eW59l3NQ6sa3HcB+Ahf7pP6iGU7MY4we5JsPqXQ2ZcIPF8QxSg/lkY8lN0Js/AG0NjMbk+nZGUfHlceiHF+bwQ=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], @@ -2098,8 +2130,6 @@ "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], - "openrouter": ["openrouter@workspace:openrouter"], - "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], @@ -2474,7 +2504,7 @@ "zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + "zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], "zod-from-json-schema-v3": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], @@ -2536,16 +2566,10 @@ "@deco-cx/warp-node/undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], - "@deco/mcp/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "@deco-cx/warp-node/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], "@deco/mcp/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@decocms/bindings/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - - "@decocms/bindings/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], - - "@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], @@ -2628,10 +2652,6 @@ "@mastra/schema-compat/ai": ["ai@5.0.97", "", { "dependencies": { "@ai-sdk/gateway": "2.0.12", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8zBx0b/owis4eJI2tAlV8a1Rv0BANmLxontcAelkLNwEHhgfgXeKpDkhNB6OgV+BJSwboIUDkgd9312DdJnCOQ=="], - "@mastra/schema-compat/zod-from-json-schema": ["zod-from-json-schema@0.5.2", "", { "dependencies": { "zod": "^4.0.17" } }, "sha512-/dNaicfdhJTOuUd4RImbLUE2g5yrSzzDjI/S6C2vO2ecAGZzn9UcRVgtyLSnENSmAOBRiSpUdzDS6fDWX3Z35g=="], - - "@modelcontextprotocol/sdk/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@openrouter/ai-sdk-provider/@openrouter/sdk": ["@openrouter/sdk@0.1.27", "", { "dependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RH//L10bSmc81q25zAZudiI4kNkLgxF2E+WU42vghp3N6TEvZ6F0jK7uT3tOxkEn91gzmMw9YVmDENy7SJsajQ=="], "@openrouter/ai-sdk-provider/ai": ["ai@5.0.97", "", { "dependencies": { "@ai-sdk/gateway": "2.0.12", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8zBx0b/owis4eJI2tAlV8a1Rv0BANmLxontcAelkLNwEHhgfgXeKpDkhNB6OgV+BJSwboIUDkgd9312DdJnCOQ=="], @@ -2766,16 +2786,18 @@ "@ts-morph/common/minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="], + "@types/serve-static/@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], + "ai-v5/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.12", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@vercel/oidc": "3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W+cB1sOWvPcz9qiIsNtD+HxUrBUva2vWv2K1EFukuImX+HA0uZx3EyyOjhYQ9gtf/teqEG80M6OvJ7xx/VLV2A=="], "ai-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw=="], - "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "apify/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], + "apify/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "apify/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], @@ -2788,19 +2810,19 @@ "concurrently/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "content-scraper/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], - "content-scraper/deco-cli": ["deco-cli@0.26.0", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "^1.19.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "ws": "^8.16.0", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-fkYKYO81cK3NE4hb3zcPdMksKJiYM2mon0lKGBuvEOruVUfbhK0I7V777NZDrmaxVQXxDx0fa9i6fARjxT7muQ=="], "data-for-seo/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], + "data-for-seo/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "data-for-seo/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "datajud/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], - "datajud/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "datajud/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], - "deco-cli/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "datajud/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], @@ -2820,13 +2842,9 @@ "gemini-pro-vision/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], - "gemini-pro-vision/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "google-big-query/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "gemini-pro-vision/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], - "google-calendar/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - - "google-tag-manager/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "gemini-pro-vision/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "inquirer-search-checkbox/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], @@ -2838,20 +2856,20 @@ "log-symbols/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "mcp-studio/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], - "mcp-template-minimal/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "mcp-template-minimal/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "mcp-template-minimal/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "mcp-template-with-view/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "mcp-template-with-view/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "mcp-template-with-view/lucide-react": ["lucide-react@0.476.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-x6cLTk8gahdUPje0hSgLN1/MgiJH+Xl90Xoxy9bkPAsMPOUiyRSKR4JCDPGVCEpyqnZXH3exFWNItcvra9WzUQ=="], "mcp-template-with-view/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "meta-ads/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], @@ -2860,26 +2878,32 @@ "nanobanana/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "nanobanana/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "nanobanana/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "object-storage/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "object-storage/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "object-storage/lucide-react": ["lucide-react@0.476.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-x6cLTk8gahdUPje0hSgLN1/MgiJH+Xl90Xoxy9bkPAsMPOUiyRSKR4JCDPGVCEpyqnZXH3exFWNItcvra9WzUQ=="], "object-storage/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "openrouter/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "ora/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "perplexity/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], + "perplexity/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "perplexity/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "pinecone/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "pinecone/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "pinecone/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "pino-pretty/pino-abstract-transport": ["pino-abstract-transport@3.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg=="], @@ -2888,22 +2912,22 @@ "readonly-sql/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "readonly-sql/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "readonly-sql/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "reddit/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], - "reddit/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], - "reddit/deco-cli": ["deco-cli@0.26.0", "", { "dependencies": { "@deco-cx/warp-node": "0.3.16", "@modelcontextprotocol/sdk": "^1.19.1", "@supabase/ssr": "0.6.1", "@supabase/supabase-js": "2.50.0", "chalk": "^5.3.0", "commander": "^12.0.0", "glob": "^10.3.10", "ignore": "^7.0.5", "inquirer": "^9.2.15", "inquirer-search-checkbox": "^1.0.0", "inquirer-search-list": "^1.2.6", "jose": "^6.0.11", "json-schema-to-typescript": "^15.0.4", "object-hash": "^3.0.0", "prettier": "^3.6.2", "semver": "^7.6.0", "smol-toml": "^1.3.4", "ws": "^8.16.0", "zod": "^3.25.76" }, "bin": { "deco": "dist/cli.js", "deconfig": "dist/deconfig.js" } }, "sha512-fkYKYO81cK3NE4hb3zcPdMksKJiYM2mon0lKGBuvEOruVUfbhK0I7V777NZDrmaxVQXxDx0fa9i6fARjxT7muQ=="], "reddit/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "registry/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "registry/@types/node": ["@types/node@22.19.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], "replicate/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "replicate/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "replicate/replicate": ["replicate@1.4.0", "", { "optionalDependencies": { "readable-stream": ">=4.0.0" } }, "sha512-1ufKejfUVz/azy+5TnzQP7U1+MHVWZ6psnQ06az8byUUnRhT+DZ/MvewzB1NQYBVMgNKR7xPDtTwlcP5nv/5+w=="], "replicate/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -2918,6 +2942,8 @@ "sora/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "sora/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "sora/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], @@ -2926,18 +2952,20 @@ "veo/@decocms/runtime": ["@decocms/runtime@0.25.1", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-G1J09NpHkuOcBQMPDi7zJDwtNweH33/39sOsR/mpA+sRWn2W3CX51FXeB5dp06oAmCe9BoBpYnyvb896hSQ+Jg=="], + "veo/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "veo/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "whisper/@decocms/runtime": ["@decocms/runtime@0.24.0", "", { "dependencies": { "@cloudflare/workers-types": "^4.20250617.0", "@deco/mcp": "npm:@jsr/deco__mcp@0.5.5", "@mastra/cloudflare-d1": "^0.13.4", "@mastra/core": "^0.20.2", "@modelcontextprotocol/sdk": "^1.19.1", "bidc": "0.0.3", "drizzle-orm": "^0.44.5", "jose": "^6.0.11", "mime-db": "1.52.0", "zod": "^3.25.76", "zod-from-json-schema": "^0.0.5", "zod-to-json-schema": "^3.24.4" } }, "sha512-ZWa9z6I0dl4LtVnv3NUDvxuVYU0Aka1gpUEkpJP0tW2ETCGQkmDx50MdFqEksXiL1RHoNZuv45Fz8u9FkdTKJg=="], + "whisper/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.20.2", "", { "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg=="], + "whisper/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "wrangler/esbuild": ["esbuild@0.27.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.0", "@esbuild/android-arm": "0.27.0", "@esbuild/android-arm64": "0.27.0", "@esbuild/android-x64": "0.27.0", "@esbuild/darwin-arm64": "0.27.0", "@esbuild/darwin-x64": "0.27.0", "@esbuild/freebsd-arm64": "0.27.0", "@esbuild/freebsd-x64": "0.27.0", "@esbuild/linux-arm": "0.27.0", "@esbuild/linux-arm64": "0.27.0", "@esbuild/linux-ia32": "0.27.0", "@esbuild/linux-loong64": "0.27.0", "@esbuild/linux-mips64el": "0.27.0", "@esbuild/linux-ppc64": "0.27.0", "@esbuild/linux-riscv64": "0.27.0", "@esbuild/linux-s390x": "0.27.0", "@esbuild/linux-x64": "0.27.0", "@esbuild/netbsd-arm64": "0.27.0", "@esbuild/netbsd-x64": "0.27.0", "@esbuild/openbsd-arm64": "0.27.0", "@esbuild/openbsd-x64": "0.27.0", "@esbuild/openharmony-arm64": "0.27.0", "@esbuild/sunos-x64": "0.27.0", "@esbuild/win32-arm64": "0.27.0", "@esbuild/win32-ia32": "0.27.0", "@esbuild/win32-x64": "0.27.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA=="], "youch/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], - "zod-from-json-schema/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "zod-from-json-schema-v3/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "@a2a-js/sdk/express/accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], @@ -2976,14 +3004,6 @@ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "@deco/mcp/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@deco/mcp/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - - "@decocms/bindings/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], @@ -3070,33 +3090,39 @@ "ai-v5/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.0.5", "", {}, "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw=="], - "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "apify/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "apify/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "apify/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "apify/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "apify/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "cloudflare/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], "concurrently/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "content-scraper/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "content-scraper/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], + "content-scraper/deco-cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "content-scraper/deco-cli/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "data-for-seo/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "data-for-seo/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "data-for-seo/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "datajud/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "datajud/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "datajud/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "deco-cli/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "datajud/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], - "deco-cli/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "datajud/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "deco-cli/@supabase/supabase-js/@supabase/auth-js": ["@supabase/auth-js@2.70.0", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg=="], @@ -3110,13 +3136,11 @@ "gemini-pro-vision/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], - - "google-big-query/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "google-calendar/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "gemini-pro-vision/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], - "google-tag-manager/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "gemini-pro-vision/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "inquirer-search-checkbox/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], @@ -3160,69 +3184,105 @@ "log-symbols/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "mcp-studio/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "mcp-template-minimal/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "mcp-template-minimal/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "mcp-template-minimal/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "mcp-template-with-view/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "meta-ads/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "mcp-template-with-view/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "mcp-template-with-view/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "nanobanana/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "nanobanana/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "nanobanana/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "object-storage/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "object-storage/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "object-storage/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "object-storage/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], - "openrouter/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "object-storage/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "ora/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "perplexity/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "perplexity/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "perplexity/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "perplexity/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "perplexity/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "pinecone/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "pinecone/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "pinecone/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "pinecone/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "pinecone/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "readonly-sql/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "reddit/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], + "readonly-sql/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], - "reddit/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "readonly-sql/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "reddit/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "reddit/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "reddit/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], "reddit/deco-cli/@supabase/supabase-js": ["@supabase/supabase-js@2.50.0", "", { "dependencies": { "@supabase/auth-js": "2.70.0", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.10", "@supabase/storage-js": "2.7.1" } }, "sha512-M1Gd5tPaaghYZ9OjeO1iORRqbTWFEz/cF3pPubRnMPzA+A8SiUsXXWDP+DWsASZcjEcVEcVQIAF38i5wrijYOg=="], - "registry/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + "reddit/deco-cli/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], "registry/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "replicate/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "replicate/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "replicate/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "replicate/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "replicate/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "sora/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "sora/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "sora/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "sora/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "sora/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "veo/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "veo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "veo/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "veo/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "veo/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "whisper/@decocms/runtime/@mastra/core": ["@mastra/core@0.20.2", "", { "dependencies": { "@a2a-js/sdk": "~0.2.4", "@ai-sdk/anthropic-v5": "npm:@ai-sdk/anthropic@2.0.23", "@ai-sdk/google-v5": "npm:@ai-sdk/google@2.0.17", "@ai-sdk/openai-compatible-v5": "npm:@ai-sdk/openai-compatible@1.0.19", "@ai-sdk/openai-v5": "npm:@ai-sdk/openai@2.0.42", "@ai-sdk/provider": "^1.1.3", "@ai-sdk/provider-utils": "^2.2.8", "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.10", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.0", "@ai-sdk/ui-utils": "^1.2.11", "@ai-sdk/xai-v5": "npm:@ai-sdk/xai@2.0.23", "@isaacs/ttlcache": "^1.4.1", "@mastra/schema-compat": "0.11.4", "@openrouter/ai-sdk-provider-v5": "npm:@openrouter/ai-sdk-provider@1.2.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.62.1", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0", "@opentelemetry/exporter-trace-otlp-http": "^0.203.0", "@opentelemetry/otlp-exporter-base": "^0.203.0", "@opentelemetry/otlp-transformer": "^0.203.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.203.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-node": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.36.0", "@sindresorhus/slugify": "^2.2.1", "ai": "^4.3.19", "ai-v5": "npm:ai@5.0.60", "date-fns": "^3.6.0", "dotenv": "^16.6.1", "hono": "^4.9.7", "hono-openapi": "^0.4.8", "js-tiktoken": "^1.0.20", "json-schema": "^0.4.0", "json-schema-to-zod": "^2.6.1", "p-map": "^7.0.3", "pino": "^9.7.0", "pino-pretty": "^13.0.0", "radash": "^12.1.1", "sift": "^17.1.3", "xstate": "^5.20.1", "zod-to-json-schema": "^3.24.6" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-RbwuLwOVrcLbbjLFEBSlGTBA3mzGAy4bXp4JeXg2miJWDR/7WbXtxKIU+sTZGw5LpzlvvEFtj7JtHI1l+gKMVg=="], - "whisper/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.2", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww=="], + "whisper/@decocms/runtime/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + + "whisper/@decocms/runtime/zod-from-json-schema": ["zod-from-json-schema@0.0.5", "", { "dependencies": { "zod": "^3.24.2" } }, "sha512-zYEoo86M1qpA1Pq6329oSyHLS785z/mTwfr9V1Xf/ZLhuuBGaMlDGu/pDVGVUe4H4oa1EFgWZT53DP0U3oT9CQ=="], + + "whisper/@modelcontextprotocol/sdk/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="], @@ -3298,12 +3358,6 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - "@deco/mcp/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "@decocms/bindings/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "@mastra/schema-compat/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.0.5", "", {}, "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw=="], "@openrouter/ai-sdk-provider-v5/ai/@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.0.5", "", {}, "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw=="], @@ -3334,11 +3388,9 @@ "apify/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "apify/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "apify/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "content-scraper/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "apify/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "content-scraper/deco-cli/@supabase/supabase-js/@supabase/auth-js": ["@supabase/auth-js@2.70.0", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg=="], @@ -3374,10 +3426,10 @@ "data-for-seo/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "data-for-seo/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "datajud/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "datajud/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3402,11 +3454,9 @@ "datajud/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "datajud/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "datajud/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "deco-cli/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "datajud/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], @@ -3434,15 +3484,9 @@ "gemini-pro-vision/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "google-big-query/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "google-calendar/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "google-tag-manager/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "gemini-pro-vision/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "inquirer-search-checkbox/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], @@ -3464,8 +3508,6 @@ "inquirer-search-list/inquirer/strip-ansi/ansi-regex": ["ansi-regex@3.0.1", "", {}, "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="], - "mcp-studio/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "mcp-template-minimal/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "mcp-template-minimal/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3490,10 +3532,10 @@ "mcp-template-minimal/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "mcp-template-minimal/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "mcp-template-with-view/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "mcp-template-with-view/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3518,11 +3560,9 @@ "mcp-template-with-view/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "meta-ads/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "mcp-template-with-view/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "nanobanana/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], @@ -3548,10 +3588,10 @@ "nanobanana/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "nanobanana/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "object-storage/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "object-storage/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3576,11 +3616,9 @@ "object-storage/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "object-storage/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "object-storage/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - "openrouter/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + "object-storage/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "perplexity/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], @@ -3606,10 +3644,10 @@ "perplexity/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "perplexity/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "perplexity/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "perplexity/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "pinecone/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "pinecone/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3634,10 +3672,10 @@ "pinecone/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "pinecone/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "pinecone/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "pinecone/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "readonly-sql/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "readonly-sql/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3662,10 +3700,10 @@ "readonly-sql/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "readonly-sql/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "reddit/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "reddit/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3690,8 +3728,6 @@ "reddit/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "reddit/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "reddit/deco-cli/@supabase/supabase-js/@supabase/auth-js": ["@supabase/auth-js@2.70.0", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-BaAK/tOAZFJtzF1sE3gJ2FwTjLf4ky3PSvcvLGEgEmO4BSBkwWKu8l67rLLIBZPDnCyV7Owk2uPyKHa0kj5QGg=="], "reddit/deco-cli/@supabase/supabase-js/@supabase/functions-js": ["@supabase/functions-js@2.4.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA=="], @@ -3702,8 +3738,6 @@ "reddit/deco-cli/@supabase/supabase-js/@supabase/storage-js": ["@supabase/storage-js@2.7.1", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA=="], - "registry/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "replicate/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3728,10 +3762,10 @@ "replicate/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "replicate/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "replicate/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "replicate/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "sora/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "sora/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3756,10 +3790,10 @@ "sora/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "sora/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "sora/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "sora/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "veo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "veo/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3784,10 +3818,10 @@ "veo/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "veo/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "veo/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "veo/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "whisper/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5": ["@ai-sdk/anthropic@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZEBiiv1UhjGjBwUU63pFhLK5LCSlNDb1idY9K1oZHm5/Fda1cuTojf32tOp0opH0RPbPAN/F8fyyNjbU33n9Kw=="], "whisper/@decocms/runtime/@mastra/core/@ai-sdk/google-v5": ["@ai-sdk/google@2.0.17", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-6LyuUrCZuiULg0rUV+kT4T2jG19oUntudorI4ttv1ARkSbwl8A39ue3rA487aDDy6fUScdbGFiV5Yv/o4gidVA=="], @@ -3812,10 +3846,10 @@ "whisper/@decocms/runtime/@mastra/core/ai-v5": ["ai@5.0.60", "", { "dependencies": { "@ai-sdk/gateway": "1.0.33", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.10", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-80U/3kmdBW6g+JkLXpz/P2EwkyEaWlPlYtuLUpx/JYK9F7WZh9NnkYoh1KvUi1Sbpo0NyurBTvX0a2AG9mmbDA=="], - "whisper/@decocms/runtime/@modelcontextprotocol/sdk/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - "whisper/@decocms/runtime/@modelcontextprotocol/sdk/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "whisper/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "apify/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "apify/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -3850,10 +3884,6 @@ "apify/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "apify/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "content-scraper/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "data-for-seo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -3888,8 +3918,6 @@ "data-for-seo/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "data-for-seo/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "datajud/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "datajud/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -3924,8 +3952,6 @@ "datajud/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "datajud/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "gemini-pro-vision/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "gemini-pro-vision/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -3960,8 +3986,6 @@ "gemini-pro-vision/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "gemini-pro-vision/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "inquirer-search-checkbox/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], "inquirer-search-checkbox/inquirer/cli-cursor/restore-cursor/onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="], @@ -4008,8 +4032,6 @@ "mcp-template-minimal/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "mcp-template-minimal/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "mcp-template-with-view/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "mcp-template-with-view/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4044,8 +4066,6 @@ "mcp-template-with-view/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "mcp-template-with-view/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "nanobanana/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "nanobanana/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4080,8 +4100,6 @@ "nanobanana/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "nanobanana/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "object-storage/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "object-storage/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4116,8 +4134,6 @@ "object-storage/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "object-storage/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "perplexity/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "perplexity/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4152,8 +4168,6 @@ "perplexity/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "perplexity/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "pinecone/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "pinecone/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4188,8 +4202,6 @@ "pinecone/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "pinecone/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "readonly-sql/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "readonly-sql/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4224,8 +4236,6 @@ "readonly-sql/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "readonly-sql/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "reddit/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "reddit/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4260,8 +4270,6 @@ "reddit/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "reddit/deco-cli/@supabase/supabase-js/@supabase/realtime-js/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], - "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "replicate/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4296,8 +4304,6 @@ "replicate/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "replicate/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "sora/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "sora/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4332,8 +4338,6 @@ "sora/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "sora/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "veo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "veo/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4368,8 +4372,6 @@ "veo/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "veo/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "whisper/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], "whisper/@decocms/runtime/@mastra/core/@ai-sdk/anthropic-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], @@ -4404,8 +4406,6 @@ "whisper/@decocms/runtime/@mastra/core/ai-v5/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.10", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ=="], - "whisper/@decocms/runtime/@modelcontextprotocol/sdk/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - "apify/@decocms/runtime/@mastra/core/@mastra/schema-compat/zod-from-json-schema/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], "apify/@decocms/runtime/@mastra/core/@openrouter/ai-sdk-provider-v5/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@2.0.12", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.17", "@vercel/oidc": "3.0.5" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W+cB1sOWvPcz9qiIsNtD+HxUrBUva2vWv2K1EFukuImX+HA0uZx3EyyOjhYQ9gtf/teqEG80M6OvJ7xx/VLV2A=="], diff --git a/content-scraper/package.json b/content-scraper/package.json index 408ba7c1..c0641cd6 100644 --- a/content-scraper/package.json +++ b/content-scraper/package.json @@ -14,7 +14,7 @@ "build": "bun run build:server" }, "dependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "@supabase/supabase-js": "^2.49.0", "zod": "^4.0.0" }, diff --git a/deco-llm/.gitignore b/deco-llm/.gitignore new file mode 100644 index 00000000..babca1bb --- /dev/null +++ b/deco-llm/.gitignore @@ -0,0 +1 @@ +.dev.vars diff --git a/deco-llm/app.json b/deco-llm/app.json new file mode 100644 index 00000000..d64c4c82 --- /dev/null +++ b/deco-llm/app.json @@ -0,0 +1,11 @@ +{ + "scopeName": "deco", + "name": "llm", + "connection": { + "type": "HTTP", + "url": "https://sites-deco-llm.decocache.com/mcp" + }, + "description": "Deco LLM App Connection for LLM uses.", + "icon": "https://assets.decocache.com/mcp/6e1418f7-c962-406b-aceb-137197902709/ai-gateway.png", + "unlisted": false +} \ No newline at end of file diff --git a/deco-llm/package.json b/deco-llm/package.json new file mode 100644 index 00000000..470fae4f --- /dev/null +++ b/deco-llm/package.json @@ -0,0 +1,40 @@ +{ + "name": "deco-llm", + "version": "1.0.0", + "description": "Deco LLM App Connection for LLM uses.", + "private": true, + "type": "module", + "scripts": { + "dev": "bun run --hot server/main.ts", + "build:server": "NODE_ENV=production bun build server/main.ts --target=bun --outfile=dist/server/main.js", + "build": "bun run build:server", + "publish": "cat app.json | deco registry publish -w /shared/deco -y", + "check": "tsc --noEmit" + }, + "dependencies": { + "@ai-sdk/provider": "^3.0.2", + "@ai-sdk/provider-utils": "^4.0.4", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", + "@openrouter/ai-sdk-provider": "^1.5.4", + "@openrouter/sdk": "^0.3.11", + "ai": "^6.0.3", + "zod": "^4.0.0" + }, + "devDependencies": { + "@cloudflare/vite-plugin": "^1.13.4", + "@cloudflare/workers-types": "^4.20251014.0", + "@decocms/mcps-shared": "1.0.0", + "@decocms/openrouter": "1.0.0", + "@mastra/core": "^0.24.0", + "@modelcontextprotocol/sdk": "1.25.1", + "@types/mime-db": "^1.43.6", + "deco-cli": "^0.28.0", + "typescript": "^5.7.2", + "vite": "7.2.0", + "wrangler": "^4.28.0" + }, + "engines": { + "node": ">=22.0.0" + } +} \ No newline at end of file diff --git a/deco-llm/server/main.ts b/deco-llm/server/main.ts new file mode 100644 index 00000000..82fabc2e --- /dev/null +++ b/deco-llm/server/main.ts @@ -0,0 +1,104 @@ +/** + * OpenRouter MCP Server + * + * This MCP provides tools for interacting with OpenRouter's API, + * including model discovery, comparison, and AI chat completions. + * + * OpenRouter offers a unified API for accessing hundreds of AI models + * with built-in fallback mechanisms, cost optimization, and provider routing. + */ +import type { Registry } from "@decocms/mcps-shared/registry"; +import { serve } from "@decocms/mcps-shared/serve"; +import { tools } from "@decocms/openrouter/tools"; +import { BindingOf, type DefaultEnv, withRuntime } from "@decocms/runtime"; +import { z } from "zod"; +import { calculatePreAuthAmount, toMicrodollars } from "./usage"; + +export const StateSchema = z.object({ + WALLET: BindingOf("@deco/wallet"), +}); + +/** + * Environment type combining Deco bindings and Cloudflare Workers context + */ +export type Env = DefaultEnv; + +interface OpenRouterUsageReport { + providerMetadata: { + openrouter: { + usage: { + cost: number; + }; + }; + }; +} +const isOpenRouterUsageReport = ( + usage: unknown | OpenRouterUsageReport, +): usage is OpenRouterUsageReport => { + return ( + typeof usage === "object" && + usage !== null && + "providerMetadata" in usage && + typeof usage.providerMetadata === "object" && + usage.providerMetadata !== null && + "openrouter" in usage.providerMetadata && + typeof usage.providerMetadata.openrouter === "object" && + usage.providerMetadata.openrouter !== null && + "usage" in usage.providerMetadata.openrouter && + typeof usage.providerMetadata.openrouter.usage === "object" && + usage.providerMetadata.openrouter.usage !== null && + "cost" in usage.providerMetadata.openrouter.usage + ); +}; + +const runtime = withRuntime< + DefaultEnv, + typeof StateSchema, + Registry +>({ + tools: (env) => { + return tools(env, { + start: async (modelInfo, params) => { + const amount = calculatePreAuthAmount(modelInfo, params); + + const { id } = + await env.MESH_REQUEST_CONTEXT.state.WALLET.PRE_AUTHORIZE_AMOUNT({ + amount, + metadata: { + modelId: modelInfo.id, + params: params, + }, + }); + return { + end: async (usage) => { + if (!isOpenRouterUsageReport(usage)) { + throw new Error("Usage cost not found"); + } + const vendorId = process.env.WALLET_VENDOR_ID ?? "deco"; + await env.MESH_REQUEST_CONTEXT.state.WALLET.COMMIT_PRE_AUTHORIZED_AMOUNT( + { + identifier: id, + contractId: + env.MESH_REQUEST_CONTEXT.connectionId ?? + env.MESH_REQUEST_CONTEXT.state.WALLET.value, + vendorId, + amount: toMicrodollars( + usage.providerMetadata.openrouter.usage.cost, + ), + }, + ); + }, + }; + }, + }); + }, + configuration: { + state: StateSchema, + scopes: [ + "WALLET::PRE_AUTHORIZE_AMOUNT", + "WALLET::COMMIT_PRE_AUTHORIZED_AMOUNT", + ], + }, +}); + +serve(runtime.fetch); diff --git a/deco-llm/server/usage.ts b/deco-llm/server/usage.ts new file mode 100644 index 00000000..93274ee7 --- /dev/null +++ b/deco-llm/server/usage.ts @@ -0,0 +1,44 @@ +import type { LanguageModelInputSchema } from "@decocms/bindings/llm"; +import type { ModelInfo } from "@decocms/openrouter/types"; +import type { z } from "zod"; + +export interface GenerationContext { + model: ModelInfo; +} + +const DEFAULT_MAX_COMPLETION_TOKENS = 1000000; + +export const toMicrodollars = (amount: number): string => { + return Math.round(amount * 1_000_000).toString(); +}; +/** + * + * @param model - The model to calculate the pre-auth amount for + * @param params - The parameters for the language model + * @returns The pre-auth amount in microdollars + */ +export const calculatePreAuthAmount = ( + model: ModelInfo, + params: z.infer, +): string => { + const maxContextLength = Math.min( + JSON.stringify({ + ...params.callOptions.prompt, + ...params.callOptions.tools, + }).length, + model.context_length, + ); + + const maxCompletionTokens = + params.callOptions.maxOutputTokens ?? + model.top_provider?.max_completion_tokens ?? + DEFAULT_MAX_COMPLETION_TOKENS; + + const constPerCompletionToken = parseFloat(model.pricing.completion); + const constPerPromptToken = parseFloat(model.pricing.prompt); + + const amountUsd = + maxContextLength * constPerPromptToken + + maxCompletionTokens * constPerCompletionToken; + return toMicrodollars(amountUsd); +}; diff --git a/deco-llm/tsconfig.json b/deco-llm/tsconfig.json new file mode 100644 index 00000000..63f6f70b --- /dev/null +++ b/deco-llm/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2023", "ES2024", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "allowJs": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + + /* Path Aliases */ + "baseUrl": ".", + "paths": { + "shared/*": ["./shared/*"], + "server/*": ["./server/*"], + "worker/*": ["./worker/*"] + }, + + /* Types */ + "types": ["@cloudflare/workers-types"] + }, + "include": [ + "server", + "shared", + "vite.config.ts" + ] +} diff --git a/google-calendar/package.json b/google-calendar/package.json index 59330cfd..3a04761e 100644 --- a/google-calendar/package.json +++ b/google-calendar/package.json @@ -12,7 +12,7 @@ "check": "tsc --noEmit" }, "dependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0" }, "devDependencies": { diff --git a/google-tag-manager/package.json b/google-tag-manager/package.json index 54052b06..e7c4a9dc 100644 --- a/google-tag-manager/package.json +++ b/google-tag-manager/package.json @@ -12,7 +12,7 @@ "check": "tsc --noEmit" }, "dependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0" }, "devDependencies": { diff --git a/mcp-studio/package.json b/mcp-studio/package.json index de4c86a2..51aef626 100644 --- a/mcp-studio/package.json +++ b/mcp-studio/package.json @@ -16,7 +16,7 @@ "dependencies": { "@ai-sdk/mcp": "^1.0.1", "@decocms/bindings": "^1.0.8", - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "@jitl/quickjs-singlefile-cjs-release-sync": "^0.31.0", "@modelcontextprotocol/sdk": "^1.25.1", "@radix-ui/react-collapsible": "^1.1.12", diff --git a/mcp-studio/server/types/env.ts b/mcp-studio/server/types/env.ts index 8a2972ea..f70329e2 100644 --- a/mcp-studio/server/types/env.ts +++ b/mcp-studio/server/types/env.ts @@ -4,13 +4,8 @@ * Central definition for the Env type used throughout the workflow system. */ -import type { EVENT_BUS_BINDING } from "@decocms/bindings"; -import type { createCollectionBindings } from "@decocms/bindings/collections"; -import { - BindingOf, - type BindingRegistry, - type DefaultEnv, -} from "@decocms/runtime"; +import type { Registry } from "@decocms/mcps-shared/registry"; +import { BindingOf, type DefaultEnv } from "@decocms/runtime"; import z from "zod"; export const StateSchema = z.object({ @@ -19,74 +14,5 @@ export const StateSchema = z.object({ CONNECTION: BindingOf("@deco/connection"), }); -export type ConnectionBinding = { - COLLECTION_CONNECTIONS_UPDATE: (params: { - id: string; - data: { - configuration_state: object; - configuration_scopes: string[]; - }; - }) => Promise; - COLLECTION_CONNECTIONS_GET: (params: { id: string }) => Promise<{ - item: { - configuration_state: object; - configuration_scopes: string[]; - tools: { - name: string; - description: string; - inputSchema: object; - outputSchema: object; - }[]; - }; - }>; - // Accepts an (empty) object because MCP tool validation rejects `undefined` inputs. - COLLECTION_CONNECTIONS_LIST: (params?: Record) => Promise<{ - items: { - id: string; - title: string; - tools: { - name: string; - description: string; - inputSchema: object; - outputSchema: object; - }[]; - }[]; - }>; -}; -const ConnectionSchema = z.object({ - configuration_state: z.object({}), - configuration_scopes: z.array(z.string()), - tools: z.array( - z.object({ - name: z.string(), - description: z.string(), - inputSchema: z.object({}), - outputSchema: z.object({}), - }), - ), -}); - -export interface Registry extends BindingRegistry { - "@deco/event-bus": typeof EVENT_BUS_BINDING; - "@deco/connection": ReturnType< - typeof createCollectionBindings - >; - "@deco/postgres": [ - { - name: "DATABASES_RUN_SQL"; - description: "Run a SQL query against the database"; - inputSchema: z.ZodType<{ - sql: string; - params?: unknown[]; - }>; - outputSchema: z.ZodType<{ - result: { - results?: unknown[]; - success?: boolean; - }[]; - }>; - }, - ]; -} - export type Env = DefaultEnv; +export type { Registry }; diff --git a/meta-ads/package.json b/meta-ads/package.json index 30410a46..2a491bef 100644 --- a/meta-ads/package.json +++ b/meta-ads/package.json @@ -13,7 +13,7 @@ "dev:tunnel": "deco link -p 3003 -- PORT=3003 bun run dev" }, "dependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "zod": "^4.0.0" }, "devDependencies": { diff --git a/openrouter/package.json b/openrouter/package.json index 7a9bfba3..c5528b6d 100644 --- a/openrouter/package.json +++ b/openrouter/package.json @@ -1,5 +1,5 @@ { - "name": "openrouter", + "name": "@decocms/openrouter", "version": "1.0.0", "description": "OpenRouter AI model routing and management", "private": true, @@ -11,11 +11,16 @@ "publish": "cat app.json | deco registry publish -w /shared/deco -y", "check": "tsc --noEmit" }, + "exports": { + "./tools": "./server/tools/index.ts", + "./types": "./server/lib/types.ts", + "./hooks": "./server/tools/hooks.ts" + }, "dependencies": { "@ai-sdk/provider": "^3.0.2", "@ai-sdk/provider-utils": "^4.0.4", "@decocms/bindings": "^1.0.7", - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "@openrouter/ai-sdk-provider": "^1.5.4", "@openrouter/sdk": "^0.3.11", "ai": "^6.0.3", diff --git a/openrouter/server/lib/env.ts b/openrouter/server/lib/env.ts index fdbab23f..3c404254 100644 --- a/openrouter/server/lib/env.ts +++ b/openrouter/server/lib/env.ts @@ -1,7 +1,8 @@ import type { Env } from "server/main"; export const getOpenRouterApiKey = (env: Env) => { - const authorization = env.MESH_REQUEST_CONTEXT.authorization; + const authorization = + env.MESH_REQUEST_CONTEXT.authorization ?? process.env.OPENROUTER_API_KEY; if (!authorization) { throw new Error("Authorization header is required"); } diff --git a/openrouter/server/lib/openrouter-client.ts b/openrouter/server/lib/openrouter-client.ts index 39e58139..0218c039 100644 --- a/openrouter/server/lib/openrouter-client.ts +++ b/openrouter/server/lib/openrouter-client.ts @@ -45,6 +45,12 @@ export class OpenRouterClient { this.modelCache = new Map(); } + static for(apiKey: string) { + return new OpenRouterClient({ + apiKey, + }); + } + /** * List all available models */ diff --git a/openrouter/server/main.ts b/openrouter/server/main.ts index 09750661..56e3a719 100644 --- a/openrouter/server/main.ts +++ b/openrouter/server/main.ts @@ -7,17 +7,20 @@ * OpenRouter offers a unified API for accessing hundreds of AI models * with built-in fallback mechanisms, cost optimization, and provider routing. */ -import { type DefaultEnv, withRuntime } from "@decocms/runtime"; +import type { Registry } from "@decocms/mcps-shared/registry"; import { serve } from "@decocms/mcps-shared/serve"; - +import { type DefaultEnv, withRuntime } from "@decocms/runtime"; +import { z } from "zod"; import { tools } from "./tools/index.ts"; +const StateSchema = z.object({}); /** * Environment type combining Deco bindings and Cloudflare Workers context */ -export type Env = DefaultEnv; -const runtime = withRuntime({ +export type Env = DefaultEnv; + +const runtime = withRuntime({ oauth: { mode: "PKCE", // Used in protected resource metadata to point to the auth server diff --git a/openrouter/server/tools/hooks.ts b/openrouter/server/tools/hooks.ts new file mode 100644 index 00000000..d2bacd69 --- /dev/null +++ b/openrouter/server/tools/hooks.ts @@ -0,0 +1,16 @@ +import type { LanguageModelV2Usage } from "@ai-sdk/provider"; +import type { LanguageModelInputSchema } from "@decocms/bindings/llm"; +import type { ModelInfo } from "server/lib/types"; +import type { z } from "zod"; + +export interface UsageHooks { + start: ( + modelInfo: ModelInfo, + params: z.infer, + ) => Promise<{ + end: (usage: { + usage: LanguageModelV2Usage; + providerMetadata?: unknown; + }) => Promise; + }>; +} diff --git a/openrouter/server/tools/index.ts b/openrouter/server/tools/index.ts index 0870b74a..7e57dc71 100644 --- a/openrouter/server/tools/index.ts +++ b/openrouter/server/tools/index.ts @@ -10,6 +10,8 @@ * - llmBinding: LLM binding implementation (metadata, stream, generate, list, get) * - modelTools: Model comparison and recommendations (separate utilities) */ +import type { Env } from "../main.ts"; +import type { UsageHooks } from "./hooks.ts"; import { createGetLLMTool, createListLLMTool, @@ -22,20 +24,21 @@ import { createRecommendModelTool, } from "./models/index.ts"; -// Export all tools from all modules -export const tools = [ - // LLM Binding - implements all 5 required tools: - // - COLLECTION_LLM_LIST - // - COLLECTION_LLM_GET - // - LLM_METADATA - // - LLM_DO_STREAM - // - LLM_DO_GENERATE - createListLLMTool, - createGetLLMTool, - createLLMMetadataTool, - createLLMStreamTool, - createLLMGenerateTool, - // Additional model utilities (not part of LLM binding) - createCompareModelsTool, - createRecommendModelTool, -]; +export const tools = (env: TEnv, hooks?: UsageHooks) => { + return [ + // LLM Binding - implements all 5 required tools: + // - COLLECTION_LLM_LIST + // - COLLECTION_LLM_GET + // - LLM_METADATA + // - LLM_DO_STREAM + // - LLM_DO_GENERATE + createListLLMTool(env), + createGetLLMTool(env), + createLLMMetadataTool(env), + createLLMStreamTool(hooks)(env), + createLLMGenerateTool(hooks)(env), + // Additional model utilities (not part of LLM binding) + createCompareModelsTool(env), + createRecommendModelTool(env), + ]; +}; diff --git a/openrouter/server/tools/llm-binding.ts b/openrouter/server/tools/llm-binding.ts index 1d9e4c19..2bc53326 100644 --- a/openrouter/server/tools/llm-binding.ts +++ b/openrouter/server/tools/llm-binding.ts @@ -24,6 +24,7 @@ import { getOpenRouterApiKey } from "server/lib/env.ts"; import type { z } from "zod"; import { OpenRouterClient } from "../lib/openrouter-client.ts"; import type { Env } from "../main.ts"; +import type { UsageHooks } from "./hooks.ts"; import { getBaseUrl } from "./models/utils.ts"; import { WELL_KNOWN_MODEL_IDS } from "./models/well-known.ts"; @@ -566,7 +567,7 @@ const isAPICallError = (error: unknown): error is APICallError => /** * LLM_DO_STREAM - Streams a language model response in real-time */ -export const createLLMStreamTool = (env: Env) => +export const createLLMStreamTool = (usageHooks?: UsageHooks) => (env: Env) => createStreamableTool({ id: "LLM_DO_STREAM", description: @@ -586,13 +587,18 @@ export const createLLMStreamTool = (env: Env) => const model = openrouter.languageModel(modelId); try { + const hook = await usageHooks?.start?.( + await OpenRouterClient.for(apiKey).getModel(modelId), + context, + ); const callResponse = await model.doStream( callOptions as Parameters<(typeof model)["doStream"]>[0], ); - const [_, stream] = getUsageFromStream( + const [usage, stream] = getUsageFromStream( callResponse.stream as ReadableStream, ); + usage.then((usage) => hook?.end?.(usage)); const response = streamToResponse(stream); // Return the data stream response @@ -720,7 +726,7 @@ function transformGenerateResult(result: unknown): Record { /** * LLM_DO_GENERATE - Generates a complete response in a single call (non-streaming) */ -export const createLLMGenerateTool = (env: Env) => +export const createLLMGenerateTool = (usageHooks?: UsageHooks) => (env: Env) => createPrivateTool({ id: "LLM_DO_GENERATE", description: @@ -741,10 +747,15 @@ export const createLLMGenerateTool = (env: Env) => const openrouter = createOpenRouter({ apiKey }); const model = openrouter.languageModel(modelId); + const hook = await usageHooks?.start?.( + await OpenRouterClient.for(apiKey).getModel(modelId), + context, + ); // Use doGenerate directly (consistent with doStream pattern) const result = await model.doGenerate( callOptions as Parameters<(typeof model)["doGenerate"]>[0], ); + await hook?.end?.(result); // Transform the result to match the binding schema return transformGenerateResult(result) as z.infer< @@ -752,15 +763,3 @@ export const createLLMGenerateTool = (env: Env) => >; }, }); - -/** - * Creates all LLM binding tools for OpenRouter. - * Returns an array of tools that implement the Language Model binding. - */ -export const createLLMBinding = (env: Env) => [ - createListLLMTool(env), - createGetLLMTool(env), - createLLMMetadataTool(env), - createLLMStreamTool(env), - createLLMGenerateTool(env), -]; diff --git a/package.json b/package.json index 539d6872..8354c76e 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,8 @@ "template-with-view", "veo", "whisper", - "mcp-studio" + "mcp-studio", + "deco-llm" ], "dependencies": { "@types/node": "^24.10.0" diff --git a/registry/package.json b/registry/package.json index 1dd9f516..fb00ea08 100644 --- a/registry/package.json +++ b/registry/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@decocms/bindings": "^1.0.4", - "@decocms/runtime": "^1.1.2", + "@decocms/runtime": "^1.1.3", "@supabase/supabase-js": "^2.89.0", "zod": "^4.0.0" }, diff --git a/shared/package.json b/shared/package.json index eafa41a1..e8b410dc 100644 --- a/shared/package.json +++ b/shared/package.json @@ -17,10 +17,12 @@ "./audio-transcribers": "./audio-transcribers/index.ts", "./storage": "./storage/index.ts", "./search-ai": "./search-ai/index.ts", - "./serve": "./serve.ts" + "./serve": "./serve.ts", + "./registry": "./registry.ts" }, "devDependencies": { - "@decocms/runtime": "^1.1.2", + "@decocms/bindings": "^1.0.7", + "@decocms/runtime": "^1.1.3", "@types/bun": "^1.2.14", "vite": "7.2.0", "zod": "^4.0.0" diff --git a/shared/registry.ts b/shared/registry.ts new file mode 100644 index 00000000..67b96f41 --- /dev/null +++ b/shared/registry.ts @@ -0,0 +1,99 @@ +import type { EVENT_BUS_BINDING } from "@decocms/bindings"; +import type { createCollectionBindings } from "@decocms/bindings/collections"; +import type { BindingRegistry } from "@decocms/runtime"; +import { z } from "zod"; + +export type ConnectionBinding = { + COLLECTION_CONNECTIONS_UPDATE: (params: { + id: string; + data: { + configuration_state: object; + configuration_scopes: string[]; + }; + }) => Promise; + COLLECTION_CONNECTIONS_GET: (params: { id: string }) => Promise<{ + item: { + configuration_state: object; + configuration_scopes: string[]; + tools: { + name: string; + description: string; + inputSchema: object; + outputSchema: object; + }[]; + }; + }>; + // Accepts an (empty) object because MCP tool validation rejects `undefined` inputs. + COLLECTION_CONNECTIONS_LIST: (params?: Record) => Promise<{ + items: { + id: string; + title: string; + tools: { + name: string; + description: string; + inputSchema: object; + outputSchema: object; + }[]; + }[]; + }>; +}; +const ConnectionSchema = z.object({ + configuration_state: z.object({}), + configuration_scopes: z.array(z.string()), + tools: z.array( + z.object({ + name: z.string(), + description: z.string(), + inputSchema: z.object({}), + outputSchema: z.object({}), + }), + ), +}); + +export interface Registry extends BindingRegistry { + "@deco/event-bus": typeof EVENT_BUS_BINDING; + "@deco/connection": ReturnType< + typeof createCollectionBindings + >; + "@deco/postgres": [ + { + name: "DATABASES_RUN_SQL"; + description: "Run a SQL query against the database"; + inputSchema: z.ZodType<{ + sql: string; + params?: unknown[]; + }>; + outputSchema: z.ZodType<{ + result: { + results?: unknown[]; + success?: boolean; + }[]; + }>; + }, + ]; + "@deco/wallet": [ + { + name: "COMMIT_PRE_AUTHORIZED_AMOUNT"; + inputSchema: z.ZodType<{ + identifier?: string; + contractId: string; + vendorId: string; + amount: string; // in microdollars + metadata?: Record; + }>; + outputSchema: z.ZodType<{ + id: string; + }>; + }, + { + name: "PRE_AUTHORIZE_AMOUNT"; + inputSchema: z.ZodType<{ + amount: string; // in microdollars + metadata?: Record; + }>; + outputSchema: z.ZodType<{ + id: string; + }>; + }, + ]; +} From 6a59df023fc0e931444b5f3e43f57299949710e6 Mon Sep 17 00:00:00 2001 From: Marcos Candeia Date: Thu, 8 Jan 2026 22:04:06 -0300 Subject: [PATCH 19/31] Fixes app.json Signed-off-by: Marcos Candeia --- deco-llm/app.json | 1 + 1 file changed, 1 insertion(+) diff --git a/deco-llm/app.json b/deco-llm/app.json index d64c4c82..55f2f1f2 100644 --- a/deco-llm/app.json +++ b/deco-llm/app.json @@ -1,6 +1,7 @@ { "scopeName": "deco", "name": "llm", + "friendlyName": "Deco AI Gateway", "connection": { "type": "HTTP", "url": "https://sites-deco-llm.decocache.com/mcp" From d33f758c70ec06ae01b3fd242863676079a5c89b Mon Sep 17 00:00:00 2001 From: Marcos Candeia Date: Thu, 8 Jan 2026 22:44:39 -0300 Subject: [PATCH 20/31] Fixes build-mcp pkg Signed-off-by: Marcos Candeia --- scripts/build-mcp.ts | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/scripts/build-mcp.ts b/scripts/build-mcp.ts index 44d31f23..712adf35 100644 --- a/scripts/build-mcp.ts +++ b/scripts/build-mcp.ts @@ -1,30 +1,31 @@ import { $ } from "bun"; -const SITE_NAME_TO_MCP_FOLDER_OVERRIDES = { - vibemcp: "mcp-studio", +const PKG_NAME_OVERRIDES = { + vibemcp: "mcp-studio", + openrouter: "@decocms/openrouter", }; -const getMcpFolder = (siteName: string) => { - return SITE_NAME_TO_MCP_FOLDER_OVERRIDES[siteName] || siteName; +const getMcpPkgName = (siteName: string) => { + return PKG_NAME_OVERRIDES[siteName] || siteName; }; const siteName = process.env.DECO_SITE_NAME; if (!siteName) { - console.error("❌ Error: DECO_SITE_NAME environment variable is not set"); - process.exit(1); + console.error("❌ Error: DECO_SITE_NAME environment variable is not set"); + process.exit(1); } console.log(`Building MCP for site name ${siteName}`); -const folderToBuild = getMcpFolder(siteName); +const pkgToBuild = getMcpPkgName(siteName); -if (!folderToBuild) { - console.error( - `❌ Error building MCP: package with name ${siteName} not found`, - ); - process.exit(1); +if (!pkgToBuild) { + console.error( + `❌ Error building MCP: package with name ${siteName} not found`, + ); + process.exit(1); } -await $`bun run --filter=${folderToBuild} build`; -await $`mv ./${folderToBuild}/dist ./dist`; +await $`bun run --filter=${pkgToBuild} build`; +await $`mv ./${pkgToBuild}/dist ./dist`; From df51537e4abe3b42830b5b8ec514181a0fec661f Mon Sep 17 00:00:00 2001 From: Marcos Candeia Date: Thu, 8 Jan 2026 22:51:03 -0300 Subject: [PATCH 21/31] Fixes build script Signed-off-by: Marcos Candeia --- scripts/build-mcp.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/build-mcp.ts b/scripts/build-mcp.ts index 712adf35..ac5c0264 100644 --- a/scripts/build-mcp.ts +++ b/scripts/build-mcp.ts @@ -1,5 +1,9 @@ import { $ } from "bun"; +const FOLDER_OVERRIDES = { + vibeMcp: "mcp-studio", +}; + const PKG_NAME_OVERRIDES = { vibemcp: "mcp-studio", openrouter: "@decocms/openrouter", @@ -28,4 +32,4 @@ if (!pkgToBuild) { } await $`bun run --filter=${pkgToBuild} build`; -await $`mv ./${pkgToBuild}/dist ./dist`; +await $`mv ./${FOLDER_OVERRIDES[siteName] || siteName}/dist ./dist`; From 2f351d86bc542f58016ac2f89617f4195dc2bec8 Mon Sep 17 00:00:00 2001 From: Marcos Candeia Date: Thu, 8 Jan 2026 22:51:17 -0300 Subject: [PATCH 22/31] Fixes build script(2) Signed-off-by: Marcos Candeia --- scripts/build-mcp.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-mcp.ts b/scripts/build-mcp.ts index ac5c0264..bc8cbd36 100644 --- a/scripts/build-mcp.ts +++ b/scripts/build-mcp.ts @@ -1,7 +1,7 @@ import { $ } from "bun"; const FOLDER_OVERRIDES = { - vibeMcp: "mcp-studio", + vibemcp: "mcp-studio", }; const PKG_NAME_OVERRIDES = { From 547c6246face8eba64e19f88202fbfcfb4c113a2 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Fri, 9 Jan 2026 09:26:08 -0300 Subject: [PATCH 23/31] Update app.json files for Google Tag Manager and Grain MCP - Changed Google Tag Manager icon URL to a new asset location. - Updated Grain MCP name to "grain-mcp" and added a friendly name "Grain". - Revised Grain MCP description for clarity and conciseness. - Enhanced Grain MCP metadata with category, tags, and detailed descriptions for better context. --- cloudflare-docs/app.json | 12 ++++++++---- cloudflare-observability/app.json | 15 --------------- cloudflare-workers/app.json | 14 +++++++++----- digitalocean-apps/app.json | 12 ++++++++---- digitalocean-databases/app.json | 12 ++++++++---- exa-search/app.json | 16 ++++++++++------ github-mcp-server/app.json | 12 ++++++++---- google-bigquery-official/app.json | 12 ++++++++---- google-gke-official/app.json | 12 ++++++++---- google-maps-official/app.json | 12 ++++++++---- google-tag-manager/app.json | 2 +- grain-official/app.json | 13 +++++++++++-- hubspot-official/app.json | 12 ++++++++---- indeed-official/app.json | 12 ++++++++---- jam-dev/app.json | 12 ++++++++---- mercadolibre-official/app.json | 12 ++++++++---- mercadopago-official/app.json | 12 ++++++++---- vercel-official/app.json | 12 ++++++++---- wix-official/app.json | 12 ++++++++---- 19 files changed, 143 insertions(+), 85 deletions(-) delete mode 100644 cloudflare-observability/app.json diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json index 59cd23ce..c86ceadf 100644 --- a/cloudflare-docs/app.json +++ b/cloudflare-docs/app.json @@ -2,14 +2,18 @@ "scopeName": "cloudflare", "name": "cloudflare-docs-mcp", "friendlyName": "Cloudflare Docs", - "category": "Documentation", "connection": { "type": "HTTP", "url": "https://docs.mcp.cloudflare.com/sse" }, - "description": "Cloudflare Docs MCP Server Official - Access Cloudflare's comprehensive documentation through natural language. Search, query, and get help with Cloudflare products and APIs. This is the official MCP server from Cloudflare.", + "description": "Access Cloudflare's comprehensive documentation through natural language. Search, query, and get help with Cloudflare products and APIs instantly.", "icon": "https://www.cloudflare.com/favicon.ico", "unlisted": false, - "official": true + "metadata": { + "category": "Documentation", + "official": true, + "tags": ["documentation", "api-reference", "guides", "tutorials", "cloudflare", "learning", "support", "knowledge-base"], + "short_description": "Access Cloudflare's comprehensive documentation through natural language", + "mesh_description": "Cloudflare Docs MCP provides intelligent access to Cloudflare's extensive documentation covering all products and services. This official documentation assistant helps you find information about Workers, Pages, R2 Storage, D1 Database, Queues, Durable Objects, KV, Stream, Images, CDN, DNS, SSL/TLS, WAF, DDoS Protection, Load Balancing, Argo, Spectrum, Magic Transit, and more. Search through detailed API references with code examples in multiple languages, step-by-step tutorials for common use cases, best practices guides, troubleshooting documentation, and architectural patterns. The MCP uses semantic search to understand your questions and provide contextually relevant answers, combining information from multiple documentation pages when needed. Get instant access to product limits, pricing details, feature comparisons, migration guides, security recommendations, and performance optimization tips. Perfect for developers building on Cloudflare's platform, the MCP can explain complex concepts, suggest solutions to problems, and guide you through configuration steps with clear, actionable information." + } } - diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json deleted file mode 100644 index cca4cd4a..00000000 --- a/cloudflare-observability/app.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "scopeName": "cloudflare", - "name": "cloudflare-observability-mcp", - "friendlyName": "Cloudflare Observability", - "category": "Observability", - "connection": { - "type": "HTTP", - "url": "https://observability.mcp.cloudflare.com/sse" - }, - "description": "Cloudflare Observability MCP Server Official - Monitor and analyze your Cloudflare services. Access logs, metrics, analytics, and traces through natural language. This is the official MCP server from Cloudflare.", - "icon": "https://www.cloudflare.com/favicon.ico", - "unlisted": false, - "official": true -} - diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json index 09105d97..8e1448e0 100644 --- a/cloudflare-workers/app.json +++ b/cloudflare-workers/app.json @@ -1,15 +1,19 @@ { "scopeName": "cloudflare", - "name": "cloudflare workers", + "name": "cloudflare-workers-mcp", "friendlyName": "Cloudflare Workers", - "category": "Software Development", "connection": { "type": "HTTP", "url": "https://bindings.mcp.cloudflare.com/sse" }, - "description": "Cloudflare Workers MCP Server Official - Deploy and manage serverless functions at the edge. Interact with Workers, KV, Durable Objects, and bindings through natural language. This is the official MCP server from Cloudflare.", + "description": "Deploy and manage serverless functions at the edge with Cloudflare Workers. Interact with Workers, KV, Durable Objects, and bindings through natural language.", "icon": "https://www.cloudflare.com/favicon.ico", "unlisted": false, - "official": true + "metadata": { + "category": "Software Development", + "official": true, + "tags": ["serverless", "edge-computing", "javascript", "workers", "kv", "durable-objects", "cloudflare", "deployment", "functions"], + "short_description": "Deploy and manage serverless functions at the edge with Cloudflare Workers", + "mesh_description": "Cloudflare Workers is a serverless platform that enables developers to deploy and run code at the edge, across Cloudflare's global network of data centers. With this official MCP, you can manage Workers, interact with Workers KV (key-value storage), configure Durable Objects for stateful applications, and manage bindings between different Cloudflare services. The platform supports JavaScript, TypeScript, Python, and Rust, allowing you to build highly scalable and performant applications that run close to your users. Workers can handle millions of requests per second with sub-millisecond latency, making them ideal for API gateways, middleware, authentication, A/B testing, and edge rendering. The MCP provides natural language access to deployment workflows, environment variables, routes configuration, and real-time monitoring of your Workers performance and usage metrics." + } } - diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json index d431bac8..1e2a900a 100644 --- a/digitalocean-apps/app.json +++ b/digitalocean-apps/app.json @@ -2,14 +2,18 @@ "scopeName": "digitalocean", "name": "digitalocean-apps-mcp", "friendlyName": "DigitalOcean Apps", - "category": "Software Development", "connection": { "type": "HTTP", "url": "https://apps.mcp.digitalocean.com/mcp" }, - "description": "DigitalOcean Apps MCP Server Official - Manage your DigitalOcean applications through natural language. Deploy, monitor, and scale your apps with AI assistance. This is the official MCP server from DigitalOcean.", + "description": "Deploy and manage applications on DigitalOcean App Platform. Deploy, monitor, and scale your apps with AI assistance through natural language.", "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", "unlisted": false, - "official": true + "metadata": { + "category": "Software Development", + "official": true, + "tags": ["deployment", "paas", "containers", "hosting", "digitalocean", "ci-cd", "scaling", "app-platform", "devops"], + "short_description": "Deploy and manage applications on DigitalOcean App Platform", + "mesh_description": "DigitalOcean App Platform is a fully managed Platform as a Service (PaaS) that simplifies deploying and scaling applications. This official MCP enables you to deploy apps directly from GitHub, GitLab, or container registries with automatic builds and deployments. Manage containerized applications, static sites, and backend services with zero infrastructure management. The platform automatically provisions SSL certificates, provides built-in CDN, handles horizontal and vertical scaling, and offers zero-downtime deployments with automatic rollback capabilities. Configure environment variables, secrets, and build parameters through natural language commands. Monitor your applications with real-time metrics, access logs, and performance insights. Set up custom domains with automatic DNS configuration, manage deployment regions across multiple data centers, and configure health checks and alerts. The MCP supports Node.js, Python, Go, PHP, Ruby, and Docker-based applications, with built-in support for popular frameworks like Next.js, Django, Rails, and Laravel. Perfect for developers who want to focus on code rather than infrastructure management." + } } - diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json index 3bbf6b94..1b1b88af 100644 --- a/digitalocean-databases/app.json +++ b/digitalocean-databases/app.json @@ -2,14 +2,18 @@ "scopeName": "digitalocean", "name": "digitalocean-databases-mcp", "friendlyName": "DigitalOcean Databases", - "category": "Database", "connection": { "type": "HTTP", "url": "https://databases.mcp.digitalocean.com/mcp" }, - "description": "DigitalOcean Databases MCP Server Official - Manage your DigitalOcean managed databases through natural language. Create, configure, and monitor PostgreSQL, MySQL, Redis, and MongoDB databases with AI assistance. This is the official MCP server from DigitalOcean.", + "description": "Manage DigitalOcean managed databases through natural language. Create, configure, and monitor PostgreSQL, MySQL, Redis, and MongoDB databases with AI assistance.", "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", "unlisted": false, - "official": true + "metadata": { + "category": "Database", + "official": true, + "tags": ["database", "postgresql", "mysql", "redis", "mongodb", "managed-database", "digitalocean", "backup", "scaling"], + "short_description": "Manage DigitalOcean managed databases through natural language", + "mesh_description": "DigitalOcean Managed Databases provide fully managed, highly available database solutions for PostgreSQL, MySQL, Redis, MongoDB, and OpenSearch. This official MCP allows you to create and manage database clusters with automatic failover, daily backups, and point-in-time recovery. Scale vertically by adjusting CPU and RAM, or horizontally by adding read replicas for improved read performance. The platform handles maintenance windows, security patches, and minor version upgrades automatically. Configure connection pooling for PostgreSQL to optimize connection management, set up trusted sources and firewall rules for security, and enable SSL/TLS encryption for data in transit. Monitor database performance with real-time metrics including CPU usage, memory consumption, disk I/O, connection count, and query performance. Manage database users and permissions, configure replication lag monitoring, and set up automated backup schedules with retention policies. The MCP supports database migrations, schema changes, and provides query optimization suggestions. Access advanced features like PostgreSQL extensions, MySQL custom parameters, Redis persistence modes, and MongoDB sharding configuration through intuitive natural language commands." + } } - diff --git a/exa-search/app.json b/exa-search/app.json index 01a5f97d..19808ce3 100644 --- a/exa-search/app.json +++ b/exa-search/app.json @@ -1,15 +1,19 @@ { - "scopeName": "exa-search", + "scopeName": "exa", "name": "exa-search-mcp", "friendlyName": "Exa Search", - "category": "Search", "connection": { "type": "HTTP", "url": "https://mcp.exa.ai/mcp" }, - "description": "Exa Search MCP Server Official - AI-powered search engine for finding high-quality content. Search the web with semantic understanding and get relevant results. This is the official MCP server from Exa.", - "icon": "https://exa.ai/favicon.ico", + "description": "AI-powered semantic search engine for finding high-quality content. Search the web with natural language understanding and get relevant results instantly.", + "icon": "https://assets.decocache.com/decocms/3638f940-f5b8-463f-8724-f092c82d1f4c/exa.jpeg", "unlisted": false, - "official": true + "metadata": { + "category": "Search", + "official": true, + "tags": ["search", "ai-search", "semantic-search", "web-search", "research", "exa", "knowledge", "discovery", "nlp"], + "short_description": "AI-powered semantic search engine for finding high-quality content", + "mesh_description": "Exa is an AI-powered search engine designed specifically for LLMs and AI applications, providing semantic search capabilities that understand the meaning and context of queries rather than just matching keywords. This official MCP enables you to search the web using natural language queries that understand intent, find similar content based on examples, and discover high-quality articles, research papers, and authoritative sources. Unlike traditional search engines, Exa uses neural embeddings to understand semantic relationships between concepts, allowing you to find content even when the exact keywords don't match. Search by similarity - provide a URL or text sample and find similar content across the web. Filter results by domain, publication date, content type, and authority scores. Access cleaned, structured content without ads, popups, or irrelevant information. Use Exa for research tasks like competitive analysis, market research, academic literature review, and trend discovery. Find expert opinions, technical documentation, case studies, and data-driven articles. The search engine is optimized for factual accuracy and source reliability, making it ideal for AI applications that need trustworthy information. Perfect for building RAG systems, research assistants, content discovery tools, and knowledge management applications that require high-quality web content with semantic understanding." + } } - diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json index 8aa17612..17a4bfae 100644 --- a/github-mcp-server/app.json +++ b/github-mcp-server/app.json @@ -2,14 +2,18 @@ "scopeName": "github", "name": "github-mcp-server", "friendlyName": "GitHub", - "category": "Developer Tools", "connection": { "type": "HTTP", "url": "https://api.githubcopilot.com/mcp/" }, - "description": "GitHub MCP Server Official - Interact with GitHub platform through natural language. Manage repositories, issues, pull requests, analyze code, and automate workflows. This is the official MCP server from GitHub.", + "description": "Interact with GitHub platform through natural language. Manage repositories, issues, pull requests, analyze code, and automate workflows with AI assistance.", "icon": "https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png", "unlisted": false, - "official": true + "metadata": { + "category": "Developer Tools", + "official": true, + "tags": ["version-control", "git", "github", "repositories", "code-review", "ci-cd", "collaboration", "open-source", "devops"], + "short_description": "Interact with GitHub platform through natural language", + "mesh_description": "GitHub is the world's leading software development platform with over 100 million developers collaborating on open source and private projects. This official MCP Server enables natural language interaction with GitHub's comprehensive features including repository management, code hosting, and version control. Create and manage repositories with README files, .gitignore templates, and licenses. Handle issues and bugs with labels, milestones, assignees, and project boards for agile workflows. Review and merge pull requests with inline comments, suggested changes, code reviews, and automated checks. Manage branches, tags, and releases with semantic versioning and release notes. Configure GitHub Actions for CI/CD pipelines with automated testing, building, and deployment workflows. Set up branch protection rules, required reviews, and status checks for code quality. Use GitHub Projects for kanban boards and roadmap planning. Manage team access with organizations, teams, and granular repository permissions. Access code search to find specific functions, patterns, or files across repositories. Use GitHub Packages for hosting and managing Docker containers and software packages. Configure webhooks and integrations with third-party services. Access GitHub API for advanced automation and custom integrations. Perfect for development teams managing codebases, coordinating releases, and maintaining high code quality through collaborative workflows." + } } - diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json index e5e7d904..ad5d0f37 100644 --- a/google-bigquery-official/app.json +++ b/google-bigquery-official/app.json @@ -2,14 +2,18 @@ "scopeName": "google", "name": "google-bigquery-mcp", "friendlyName": "Google BigQuery", - "category": "Data Analysis", "connection": { "type": "HTTP", "url": "https://bigquery.googleapis.com/mcp" }, - "description": "Google BigQuery MCP Server Official - Analyze massive datasets with serverless data warehouse. Run SQL queries, manage datasets, and perform analytics through natural language. This is the official MCP server from Google.", + "description": "Analyze massive datasets with Google BigQuery serverless data warehouse. Run SQL queries, manage datasets, and perform analytics through natural language.", "icon": "https://www.gstatic.com/images/branding/product/2x/bigquery_64dp.png", "unlisted": false, - "official": true + "metadata": { + "category": "Data Analysis", + "official": true, + "tags": ["data-warehouse", "sql", "analytics", "bigdata", "google-cloud", "machine-learning", "bi", "data-science", "petabyte-scale"], + "short_description": "Analyze massive datasets with Google BigQuery serverless data warehouse", + "mesh_description": "Google BigQuery is a fully managed, serverless data warehouse that enables super-fast SQL queries using the processing power of Google's infrastructure. This official MCP provides natural language access to BigQuery's powerful analytics capabilities, allowing you to analyze petabytes of data in seconds. Create and manage datasets, tables, and views with schema definition and partitioning strategies. Run complex SQL queries with support for standard SQL, geographic functions, machine learning functions, and user-defined functions (UDFs). Load data from various sources including Cloud Storage, Cloud SQL, Sheets, and streaming inserts. Execute federated queries that can join BigQuery data with external data sources like Cloud Storage, Bigtable, or Cloud SQL. Use BigQuery ML to create and execute machine learning models directly in SQL for tasks like classification, regression, forecasting, and recommendation. Access real-time analytics with streaming inserts and automatic table updates. Optimize costs with automatic query caching, materialized views, and partitioned tables. Monitor query performance with execution plans, slot usage, and cost estimates. Set up scheduled queries for automated data refreshes, configure access controls with IAM policies, and export results to various formats for further analysis or visualization." + } } - diff --git a/google-gke-official/app.json b/google-gke-official/app.json index b7646c60..d621b9fb 100644 --- a/google-gke-official/app.json +++ b/google-gke-official/app.json @@ -2,14 +2,18 @@ "scopeName": "google", "name": "google-gke-mcp", "friendlyName": "Google GKE", - "category": "Developer Tools", "connection": { "type": "HTTP", "url": "https://container.googleapis.com/mcp" }, - "description": "Google GKE MCP Server Official - Manage Kubernetes clusters on Google Cloud. Deploy, scale, and monitor containerized applications through natural language. This is the official MCP server from Google.", + "description": "Manage Kubernetes clusters on Google Cloud with GKE. Deploy, scale, and monitor containerized applications through natural language commands.", "icon": "https://www.gstatic.com/images/branding/product/2x/gke_64dp.png", "unlisted": false, - "official": true + "metadata": { + "category": "Developer Tools", + "official": true, + "tags": ["kubernetes", "containers", "docker", "orchestration", "google-cloud", "gke", "devops", "microservices", "cloud-native"], + "short_description": "Manage Kubernetes clusters on Google Cloud with GKE", + "mesh_description": "Google Kubernetes Engine (GKE) is a managed Kubernetes service that simplifies deploying, managing, and scaling containerized applications using Google's infrastructure. This official MCP enables you to create and manage GKE clusters with autopilot or standard modes, configure node pools with custom machine types, and implement cluster autoscaling based on workload demands. Deploy applications using Kubernetes manifests, Helm charts, or Kustomize configurations. Manage pods, deployments, services, ingress, config maps, and secrets through intuitive natural language commands. Configure networking with VPC-native clusters, private clusters, and workload identity for secure service authentication. Set up horizontal pod autoscaling, vertical pod autoscaling, and cluster autoscaler for optimal resource utilization. Implement CI/CD pipelines with GKE integration, rolling updates with zero downtime, and canary deployments for gradual rollouts. Monitor cluster health, resource usage, and application performance with Cloud Monitoring and Logging integration. Configure security policies with Pod Security Standards, Binary Authorization, and network policies. Manage multi-cluster deployments with GKE Enterprise, implement service mesh with Anthos Service Mesh, and use Config Sync for GitOps workflows. Perfect for teams running cloud-native applications at scale." + } } - diff --git a/google-maps-official/app.json b/google-maps-official/app.json index 5ea5f9c8..1a677a8e 100644 --- a/google-maps-official/app.json +++ b/google-maps-official/app.json @@ -2,14 +2,18 @@ "scopeName": "google", "name": "google-maps-mcp", "friendlyName": "Google Maps", - "category": "Mapping", "connection": { "type": "HTTP", "url": "https://mapstools.googleapis.com/mcp" }, - "description": "Google Maps MCP Server Official - Access Google Maps APIs through natural language. Get directions, geocoding, places data, and mapping services. This is the official MCP server from Google.", + "description": "Access Google Maps Platform APIs through natural language. Get directions, geocoding, places data, and mapping services with AI assistance.", "icon": "https://www.gstatic.com/images/branding/product/2x/maps_64dp.png", "unlisted": false, - "official": true + "metadata": { + "category": "Mapping", + "official": true, + "tags": ["maps", "geocoding", "directions", "places", "location", "google-maps", "geospatial", "navigation", "gis"], + "short_description": "Access Google Maps Platform APIs through natural language", + "mesh_description": "Google Maps Platform provides comprehensive mapping and location services used by millions of applications worldwide. This official MCP gives you natural language access to Google Maps APIs including geocoding for converting addresses to coordinates and reverse geocoding for coordinates to addresses. Get optimal route directions with multiple transportation modes (driving, walking, bicycling, transit) considering real-time traffic conditions, toll roads, and route alternatives. Search and discover places with detailed information including business hours, ratings, reviews, photos, and contact details. Calculate accurate distances and travel times between multiple locations using the Distance Matrix API. Optimize multi-stop routes with the Directions API for efficient delivery and logistics planning. Access detailed place information with the Places API including nearby search, text search, and place details. Use the Geolocation API to determine device location based on cell towers and WiFi access points. Implement time zone services to convert coordinates to time zones and calculate local times. Create custom maps with markers, polylines, polygons, and info windows. Access Street View imagery programmatically for location verification and virtual tours. Utilize Elevation API for topographic data and terrain information. Perfect for location-based applications, delivery services, real estate platforms, and travel apps." + } } - diff --git a/google-tag-manager/app.json b/google-tag-manager/app.json index 49be9fbc..619e33a3 100644 --- a/google-tag-manager/app.json +++ b/google-tag-manager/app.json @@ -7,6 +7,6 @@ "url": "https://sites-google-tag-manager.decocache.com/mcp" }, "description": "Manage Google Tag Manager resources including accounts, containers, workspaces, tags, triggers and variables via API.", - "icon": "https://img.icons8.com/color/1200/google-tag-manager.jpg", + "icon": "https://assets.decocache.com/decocms/9636f785-2d20-4b90-8fd8-6bd8f0b29afb/google-tag-manager.jpg", "unlisted": false } diff --git a/grain-official/app.json b/grain-official/app.json index 00c13fd9..9378316e 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -2,14 +2,23 @@ "scopeName": "grain", "name": "grain-mcp", "friendlyName": "Grain", +<<<<<<< HEAD "category": "Collaboration", +======= +>>>>>>> 2795092 (Update app.json files for Google Tag Manager and Grain MCP) "connection": { "type": "HTTP", "url": "https://api.grain.com/_/mcp" }, - "description": "Grain Official MCP - Acesse e gerencie suas reuniões, transcrições e insights do Grain. Este é o MCP oficial da Grain para integração completa com a plataforma de gravação e análise de reuniões.", + "description": "Record, transcribe, and analyze meetings with Grain. Access recordings, transcripts, insights, and search through meetings with AI assistance.", "icon": "https://assets.decocache.com/mcp/1bfc7176-e7be-487c-83e6-4b9e970a8e10/Grain.svg", "unlisted": false, - "official": true + "metadata": { + "category": "Collaboration", + "official": true, + "tags": ["meetings", "transcription", "recording", "video", "collaboration", "grain", "ai-notes", "insights", "productivity"], + "short_description": "Record, transcribe, and analyze meetings with Grain", + "mesh_description": "Grain is a powerful meeting recording and analysis platform that helps teams capture, share, and learn from their customer conversations and internal meetings. This official MCP provides natural language access to your meeting recordings across Zoom, Google Meet, and Microsoft Teams. Automatically transcribe meetings with high accuracy in multiple languages, search through transcripts to find specific moments or topics, and create highlights and clips from important discussions. Extract AI-powered insights including action items, key decisions, questions asked, and sentiment analysis. Share meeting highlights with your team through integrations with Slack, Notion, and CRM systems. Build a searchable knowledge base of customer feedback, product discussions, and sales calls. Use Grain's AI to summarize long meetings, identify common themes across multiple conversations, and track important topics over time. Create custom highlight reels for onboarding, training, and knowledge sharing. Collaborate with team members by adding comments and reactions to specific moments in recordings. Perfect for sales teams analyzing customer calls, product teams gathering user feedback, and customer success teams improving support quality. The MCP enables seamless access to your meeting library, transcript search, insight extraction, and clip creation through conversational commands." + } } diff --git a/hubspot-official/app.json b/hubspot-official/app.json index a9fa12ed..7043719a 100644 --- a/hubspot-official/app.json +++ b/hubspot-official/app.json @@ -2,14 +2,18 @@ "scopeName": "hubspot", "name": "hubspot-mcp", "friendlyName": "HubSpot", - "category": "CRM", "connection": { "type": "HTTP", "url": "https://app.hubspot.com/mcp/v1/http" }, - "description": "HubSpot MCP Server Official - Manage your CRM, marketing, sales, and service operations. Create contacts, deals, tickets, and automate workflows through natural language. This is the official MCP server from HubSpot.", + "description": "Manage your CRM, marketing, sales, and service operations with HubSpot. Create contacts, deals, tickets, and automate workflows through natural language.", "icon": "https://www.hubspot.com/favicon.ico", "unlisted": false, - "official": true + "metadata": { + "category": "CRM", + "official": true, + "tags": ["crm", "marketing", "sales", "customer-service", "automation", "hubspot", "email-marketing", "lead-generation", "analytics"], + "short_description": "Manage your CRM, marketing, sales, and service operations with HubSpot", + "mesh_description": "HubSpot is a comprehensive customer relationship management (CRM) platform that combines marketing, sales, customer service, and content management tools in one unified system. This official MCP provides natural language access to HubSpot's powerful features, enabling you to manage the entire customer lifecycle from first touch to loyal advocate. Create and update contacts, companies, and deals with custom properties and associations. Build and manage your sales pipeline with deal stages, forecasting, and revenue tracking. Design and execute email marketing campaigns with personalization, A/B testing, and automated follow-ups. Create landing pages, forms, and CTAs to capture leads and drive conversions. Set up sophisticated workflow automation for lead nurturing, task creation, and data enrichment. Manage customer support with ticketing system, knowledge base, and live chat integration. Access detailed analytics and reports on marketing performance, sales activities, and customer satisfaction metrics. Configure lead scoring rules to prioritize high-value prospects, create custom dashboards for team visibility, and set up sequences for automated email outreach. Integrate with hundreds of apps through HubSpot's App Marketplace. Perfect for growing businesses that need an all-in-one platform to attract, engage, and delight customers at scale." + } } - diff --git a/indeed-official/app.json b/indeed-official/app.json index b2301136..d6d92b69 100644 --- a/indeed-official/app.json +++ b/indeed-official/app.json @@ -2,14 +2,18 @@ "scopeName": "indeed", "name": "indeed-mcp", "friendlyName": "Indeed", - "category": "Job Board", "connection": { "type": "HTTP", "url": "https://mcp.indeed.com/claude/mcp" }, - "description": "Indeed MCP Server Official - Search and interact with job listings through natural language. Access millions of jobs, post listings, and manage recruitment. This is the official MCP server from Indeed.", + "description": "Search and interact with job listings through natural language. Access millions of jobs, post listings, and manage recruitment on the world's largest job site.", "icon": "https://www.indeed.com/favicon.ico", "unlisted": false, - "official": true + "metadata": { + "category": "Job Board", + "official": true, + "tags": ["jobs", "recruitment", "hiring", "job-search", "indeed", "hr", "talent-acquisition", "careers", "employment"], + "short_description": "Search and interact with job listings on the world's largest job site", + "mesh_description": "Indeed is the world's #1 job site with over 350 million unique visitors per month and millions of job listings across all industries and experience levels. This official MCP enables job seekers to search and filter through comprehensive job listings using natural language queries, save favorite jobs, set up job alerts for specific criteria, and research companies with reviews and ratings from current and former employees. For employers and recruiters, the MCP provides tools to post job listings with detailed descriptions, requirements, and company information. Manage applications with applicant tracking features, review candidate profiles and resumes, schedule interviews, and communicate with applicants directly through the platform. Access powerful analytics on job posting performance including views, clicks, and application rates. Use Indeed's matching technology to find qualified candidates based on skills, experience, and location. Leverage salary insights and market data to create competitive compensation packages. Set up sponsored job postings to increase visibility and reach more qualified candidates. Configure screening questions to pre-filter applicants and save time in the hiring process. Perfect for both job seekers looking for their next opportunity and companies building their teams with top talent." + } } - diff --git a/jam-dev/app.json b/jam-dev/app.json index cdaa54c3..7dec5d0b 100644 --- a/jam-dev/app.json +++ b/jam-dev/app.json @@ -2,14 +2,18 @@ "scopeName": "jam", "name": "jam-dev-mcp", "friendlyName": "Jam", - "category": "Software Development", "connection": { "type": "HTTP", "url": "https://mcp.jam.dev/mcp" }, - "description": "Jam MCP Server Official - Debug faster with instant bug reports. Capture, share, and track bugs with screenshots, console logs, and network data. This is the official MCP server from Jam.", + "description": "Debug faster with instant bug reports. Capture screenshots, console logs, network data, and browser info automatically for faster bug resolution.", "icon": "https://jam.dev/favicon.ico", "unlisted": false, - "official": true + "metadata": { + "category": "Software Development", + "official": true, + "tags": ["debugging", "bug-tracking", "developer-tools", "qa", "testing", "jam", "screenshots", "browser-extension", "collaboration"], + "short_description": "Debug faster with instant comprehensive bug reports", + "mesh_description": "Jam is the fastest way to capture and share bugs, automatically including everything developers need to debug - screenshots, console logs, network requests, browser info, and device specs in a single click. This official MCP enables development teams to dramatically reduce time spent reproducing and debugging issues. When a bug is reported through Jam, it automatically captures the current page state including DOM snapshot, JavaScript console errors and warnings, network activity with request/response details, browser and OS information, screen resolution, and installed extensions. Create annotated screenshots and screen recordings with drawing tools to highlight specific issues. Reproduce bugs reliably with session replay that shows exactly what the user did. Integrate seamlessly with issue trackers including Jira, Linear, GitHub Issues, Asana, and ClickUp to create tickets with all debugging context attached. Share bugs via links without requiring recipients to have Jam installed. Use Jam for QA testing, user acceptance testing, production monitoring, and customer support. Collaborate with team members by adding comments and status updates. Track bug resolution progress and gather metrics on common issues. Configure custom templates for bug reports specific to your workflow. Perfect for product teams, QA engineers, and support teams who need to communicate bugs clearly and help developers fix issues faster without lengthy back-and-forth for missing information." + } } - diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json index 13b3b811..35cc1c0b 100644 --- a/mercadolibre-official/app.json +++ b/mercadolibre-official/app.json @@ -2,14 +2,18 @@ "scopeName": "mercadolibre", "name": "mercadolibre-mcp", "friendlyName": "Mercado Libre", - "category": "E-Commerce", "connection": { "type": "HTTP", "url": "https://mcp.mercadolibre.com/mcp" }, - "description": "Mercado Libre MCP Server Official - Manage your e-commerce operations on Latin America's largest marketplace. List products, manage orders, track sales, and handle logistics through natural language. This is the official MCP server from Mercado Libre.", + "description": "Manage your e-commerce operations on Latin America's largest marketplace. List products, manage orders, track sales, and handle logistics through natural language.", "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", "unlisted": false, - "official": true + "metadata": { + "category": "E-Commerce", + "official": true, + "tags": ["e-commerce", "marketplace", "online-selling", "latin-america", "mercadolibre", "retail", "inventory", "shipping", "sales"], + "short_description": "Manage your e-commerce operations on Latin America's largest marketplace", + "mesh_description": "Mercado Libre is Latin America's leading e-commerce platform with over 140 million active users across 18 countries including Argentina, Brazil, Mexico, Chile, Colombia, and Peru. This official MCP enables sellers to create and manage product listings with detailed descriptions, multiple images, specifications, and competitive pricing strategies. Manage your inventory across multiple warehouses and fulfillment centers with real-time stock updates. Process orders from receipt to fulfillment including order confirmation, payment verification, and shipping coordination. Integrate with Mercado Envíos for streamlined shipping with automatic label generation, tracking updates, and delivery confirmation. Handle customer inquiries and questions through the platform's messaging system with automated responses and quick replies. Monitor your seller reputation and performance metrics including response time, shipping accuracy, and customer satisfaction scores. Access detailed sales analytics with revenue reports, best-selling products, traffic sources, and conversion rates. Set up promotional campaigns with discounts, bundles, and special offers to boost sales. Manage returns and refunds efficiently while maintaining high seller ratings. Use the cross-border trade features to sell internationally within Latin America. Configure multiple payment options and installment plans to increase conversion rates. Perfect for sellers looking to grow their business in Latin American markets." + } } - diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json index adeb6a4f..ce112255 100644 --- a/mercadopago-official/app.json +++ b/mercadopago-official/app.json @@ -2,14 +2,18 @@ "scopeName": "mercadolibre", "name": "mercadopago-mcp", "friendlyName": "Mercado Pago", - "category": "Payments", "connection": { "type": "HTTP", "url": "https://mcp.mercadopago.com/mcp" }, - "description": "Mercado Pago MCP Server Official - Process payments and manage financial operations. Handle transactions, refunds, subscriptions, and payment analytics through natural language. This is the official MCP server from Mercado Pago.", + "description": "Process payments and manage financial operations with Latin America's leading fintech platform. Handle transactions, refunds, subscriptions, and payment analytics through natural language.", "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", "unlisted": false, - "official": true + "metadata": { + "category": "Payments", + "official": true, + "tags": ["payments", "fintech", "transactions", "latin-america", "mercadopago", "gateway", "subscriptions", "refunds", "checkout"], + "short_description": "Process payments and manage financial operations with Latin America's leading fintech", + "mesh_description": "Mercado Pago is Latin America's largest fintech platform processing billions of dollars in transactions annually across 18 countries. This official MCP provides comprehensive payment processing capabilities for credit cards, debit cards, digital wallets, bank transfers, cash payments, and cryptocurrencies. Create secure checkout experiences with customizable payment forms, one-click checkout for returning customers, and mobile-optimized payment flows. Process payments with smart routing to maximize approval rates, automatic retry logic for failed transactions, and real-time fraud detection and prevention. Manage recurring subscriptions with flexible billing cycles, automatic payment collection, and dunning management for failed payments. Handle refunds, chargebacks, and disputes efficiently with automated workflows and detailed transaction history. Access comprehensive financial analytics including transaction volumes, approval rates, payment methods distribution, and revenue trends. Configure installment payments with interest-free or interest-bearing options to increase conversion rates. Integrate with major e-commerce platforms, point-of-sale systems, and custom applications through robust APIs. Use QR code payments for in-person transactions with instant confirmation. Manage seller balances, withdrawals, and settlement schedules. Implement 3D Secure authentication for enhanced security compliance. Perfect for businesses of all sizes processing payments in Latin American markets with multi-currency support and local payment methods." + } } - diff --git a/vercel-official/app.json b/vercel-official/app.json index e408fec5..5bb87e46 100644 --- a/vercel-official/app.json +++ b/vercel-official/app.json @@ -2,14 +2,18 @@ "scopeName": "vercel", "name": "vercel-mcp", "friendlyName": "Vercel", - "category": "Software Development", "connection": { "type": "HTTP", "url": "https://mcp.vercel.com/" }, - "description": "Vercel MCP Server Official - Deploy and manage your frontend applications. Interact with projects, deployments, domains, and serverless functions through natural language. This is the official MCP server from Vercel.", + "description": "Deploy and manage your frontend applications with Vercel. Interact with projects, deployments, domains, and serverless functions through natural language.", "icon": "https://vercel.com/favicon.ico", "unlisted": false, - "official": true + "metadata": { + "category": "Software Development", + "official": true, + "tags": ["deployment", "frontend", "nextjs", "serverless", "vercel", "jamstack", "cdn", "edge-functions", "ci-cd"], + "short_description": "Deploy and manage your frontend applications with Vercel", + "mesh_description": "Vercel is the platform for frontend developers, providing zero-configuration deployments for modern web applications with automatic HTTPS, CDN, and serverless functions. This official MCP enables you to deploy Next.js, React, Vue, Angular, Svelte, and static sites with git integration for automatic deployments on every push. Experience instant rollbacks, preview deployments for every pull request, and production deployments on merge. Manage custom domains with automatic SSL certificate provisioning, DNS configuration, and domain redirects. Configure environment variables per deployment environment (production, preview, development) with encrypted secrets management. Deploy Edge Functions that run on Vercel's global edge network for ultra-low latency, and Serverless Functions for backend API routes with automatic scaling. Access real-time Web Analytics with Core Web Vitals tracking, page performance metrics, and visitor insights without impacting performance. Use Edge Config for ultra-low-latency data access at the edge, and KV for serverless Redis-compatible storage. Configure build settings including framework presets, custom build commands, and output directories. Set up team collaboration with role-based access control, audit logs, and deployment protection rules. Integrate with monitoring tools, implement A/B testing with Edge Middleware, and optimize images automatically with Vercel Image Optimization. Perfect for teams building high-performance web applications." + } } - diff --git a/wix-official/app.json b/wix-official/app.json index 8e3547db..937ca5b2 100644 --- a/wix-official/app.json +++ b/wix-official/app.json @@ -2,14 +2,18 @@ "scopeName": "wix", "name": "wix-mcp", "friendlyName": "Wix", - "category": "CMS", "connection": { "type": "HTTP", "url": "https://mcp.wix.com/sse" }, - "description": "Wix MCP Server Official - Build and manage websites through natural language. Create pages, manage content, customize designs, and handle e-commerce. This is the official MCP server from Wix.", + "description": "Build and manage websites through natural language with Wix's powerful CMS. Create pages, manage content, customize designs, and handle e-commerce operations.", "icon": "https://www.wix.com/favicon.ico", "unlisted": false, - "official": true + "metadata": { + "category": "CMS", + "official": true, + "tags": ["website-builder", "cms", "e-commerce", "no-code", "wix", "drag-and-drop", "templates", "blogging", "online-store"], + "short_description": "Build and manage websites with Wix's powerful no-code platform", + "mesh_description": "Wix is a leading website builder platform with over 200 million users worldwide, offering powerful tools for creating professional websites without coding. This official MCP provides natural language access to Wix's comprehensive features including creating and editing pages with drag-and-drop functionality, managing site structure and navigation, and customizing designs with thousands of templates. Build complete e-commerce stores with product catalogs, inventory management, shopping cart, checkout process, and payment gateway integrations including PayPal, Stripe, and Wix Payments. Create and manage blog content with SEO optimization, scheduling, categories, and social media integration. Use Wix's CMS capabilities to create custom databases and dynamic pages for portfolios, directories, and content-rich sites. Add interactive elements like forms, galleries, video backgrounds, animations, and custom interactions without coding. Configure SEO settings including meta tags, structured data, sitemaps, and mobile optimization for better search rankings. Manage domain names, SSL certificates, and email accounts directly from the platform. Use Wix Apps marketplace to extend functionality with thousands of integrations for marketing, analytics, bookings, events, and more. Create member areas with user authentication, roles, and permissions. Implement marketing tools including email campaigns, social media integration, and marketing automation. Access analytics and insights on visitor behavior, conversion rates, and site performance. Perfect for small businesses, entrepreneurs, and creatives building their online presence." + } } - From 26866e0af78c6d5b56620fde5b750ddeb78f8499 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Fri, 9 Jan 2026 09:36:59 -0300 Subject: [PATCH 24/31] Add cloudflare-observability app.json configuration --- cloudflare-observability/app.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 cloudflare-observability/app.json diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json new file mode 100644 index 00000000..34470375 --- /dev/null +++ b/cloudflare-observability/app.json @@ -0,0 +1,20 @@ +{ + "scopeName": "cloudflare", + "name": "cloudflare-observability-mcp", + "friendlyName": "Cloudflare Observability", + "connection": { + "type": "HTTP", + "url": "https://observability.mcp.cloudflare.com/sse" + }, + "description": "Monitor and analyze your Cloudflare services with comprehensive observability tools. Access logs, metrics, analytics, and traces through natural language.", + "icon": "https://www.cloudflare.com/favicon.ico", + "unlisted": false, + "metadata": { + "category": "Observability", + "official": true, + "tags": ["monitoring", "logs", "analytics", "metrics", "tracing", "cloudflare", "observability", "performance", "debugging"], + "short_description": "Monitor and analyze your Cloudflare services with comprehensive observability tools", + "mesh_description": "Cloudflare Observability provides enterprise-grade monitoring and analytics for all Cloudflare services including Workers, CDN, WAF, and Load Balancers. This official MCP enables you to access real-time logs from Workers, HTTP requests, firewall events, and DDoS attacks. Query and analyze performance metrics such as request latency, bandwidth usage, error rates, and cache hit ratios across global data centers. The platform offers distributed tracing capabilities to track requests across your entire application stack, helping identify bottlenecks and optimize performance. Access Web Analytics for visitor insights, GraphQL Analytics API for custom queries, and Logpush integration for streaming logs to external systems. Use natural language to configure alerting rules, create custom dashboards, analyze traffic patterns, investigate security incidents, and generate compliance reports. The MCP simplifies complex queries and provides AI-powered insights to help you understand your application's behavior and user experience." + } +} + From 5745b61784bcb0d11a415c382616624df5d66285 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Fri, 9 Jan 2026 09:43:08 -0300 Subject: [PATCH 25/31] Add mesh_unlisted property to app.json files for various services --- cloudflare-docs/app.json | 1 + cloudflare-observability/app.json | 1 + cloudflare-workers/app.json | 1 + digitalocean-apps/app.json | 1 + digitalocean-databases/app.json | 1 + github-mcp-server/app.json | 2 +- google-bigquery-official/app.json | 1 + google-gke-official/app.json | 1 + google-maps-official/app.json | 1 + hubspot-official/app.json | 1 + indeed-official/app.json | 1 + mercadolibre-official/app.json | 1 + mercadopago-official/app.json | 1 + vercel-official/app.json | 1 + wix-official/app.json | 1 + 15 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json index c86ceadf..4bc8b5f0 100644 --- a/cloudflare-docs/app.json +++ b/cloudflare-docs/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Documentation", "official": true, + "mesh_unlisted": true, "tags": ["documentation", "api-reference", "guides", "tutorials", "cloudflare", "learning", "support", "knowledge-base"], "short_description": "Access Cloudflare's comprehensive documentation through natural language", "mesh_description": "Cloudflare Docs MCP provides intelligent access to Cloudflare's extensive documentation covering all products and services. This official documentation assistant helps you find information about Workers, Pages, R2 Storage, D1 Database, Queues, Durable Objects, KV, Stream, Images, CDN, DNS, SSL/TLS, WAF, DDoS Protection, Load Balancing, Argo, Spectrum, Magic Transit, and more. Search through detailed API references with code examples in multiple languages, step-by-step tutorials for common use cases, best practices guides, troubleshooting documentation, and architectural patterns. The MCP uses semantic search to understand your questions and provide contextually relevant answers, combining information from multiple documentation pages when needed. Get instant access to product limits, pricing details, feature comparisons, migration guides, security recommendations, and performance optimization tips. Perfect for developers building on Cloudflare's platform, the MCP can explain complex concepts, suggest solutions to problems, and guide you through configuration steps with clear, actionable information." diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json index 34470375..34dc3e44 100644 --- a/cloudflare-observability/app.json +++ b/cloudflare-observability/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Observability", "official": true, + "mesh_unlisted": true, "tags": ["monitoring", "logs", "analytics", "metrics", "tracing", "cloudflare", "observability", "performance", "debugging"], "short_description": "Monitor and analyze your Cloudflare services with comprehensive observability tools", "mesh_description": "Cloudflare Observability provides enterprise-grade monitoring and analytics for all Cloudflare services including Workers, CDN, WAF, and Load Balancers. This official MCP enables you to access real-time logs from Workers, HTTP requests, firewall events, and DDoS attacks. Query and analyze performance metrics such as request latency, bandwidth usage, error rates, and cache hit ratios across global data centers. The platform offers distributed tracing capabilities to track requests across your entire application stack, helping identify bottlenecks and optimize performance. Access Web Analytics for visitor insights, GraphQL Analytics API for custom queries, and Logpush integration for streaming logs to external systems. Use natural language to configure alerting rules, create custom dashboards, analyze traffic patterns, investigate security incidents, and generate compliance reports. The MCP simplifies complex queries and provides AI-powered insights to help you understand your application's behavior and user experience." diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json index 8e1448e0..c005b750 100644 --- a/cloudflare-workers/app.json +++ b/cloudflare-workers/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Software Development", "official": true, + "mesh_unlisted": true, "tags": ["serverless", "edge-computing", "javascript", "workers", "kv", "durable-objects", "cloudflare", "deployment", "functions"], "short_description": "Deploy and manage serverless functions at the edge with Cloudflare Workers", "mesh_description": "Cloudflare Workers is a serverless platform that enables developers to deploy and run code at the edge, across Cloudflare's global network of data centers. With this official MCP, you can manage Workers, interact with Workers KV (key-value storage), configure Durable Objects for stateful applications, and manage bindings between different Cloudflare services. The platform supports JavaScript, TypeScript, Python, and Rust, allowing you to build highly scalable and performant applications that run close to your users. Workers can handle millions of requests per second with sub-millisecond latency, making them ideal for API gateways, middleware, authentication, A/B testing, and edge rendering. The MCP provides natural language access to deployment workflows, environment variables, routes configuration, and real-time monitoring of your Workers performance and usage metrics." diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json index 1e2a900a..42e6353c 100644 --- a/digitalocean-apps/app.json +++ b/digitalocean-apps/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Software Development", "official": true, + "mesh_unlisted": true, "tags": ["deployment", "paas", "containers", "hosting", "digitalocean", "ci-cd", "scaling", "app-platform", "devops"], "short_description": "Deploy and manage applications on DigitalOcean App Platform", "mesh_description": "DigitalOcean App Platform is a fully managed Platform as a Service (PaaS) that simplifies deploying and scaling applications. This official MCP enables you to deploy apps directly from GitHub, GitLab, or container registries with automatic builds and deployments. Manage containerized applications, static sites, and backend services with zero infrastructure management. The platform automatically provisions SSL certificates, provides built-in CDN, handles horizontal and vertical scaling, and offers zero-downtime deployments with automatic rollback capabilities. Configure environment variables, secrets, and build parameters through natural language commands. Monitor your applications with real-time metrics, access logs, and performance insights. Set up custom domains with automatic DNS configuration, manage deployment regions across multiple data centers, and configure health checks and alerts. The MCP supports Node.js, Python, Go, PHP, Ruby, and Docker-based applications, with built-in support for popular frameworks like Next.js, Django, Rails, and Laravel. Perfect for developers who want to focus on code rather than infrastructure management." diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json index 1b1b88af..c63d8754 100644 --- a/digitalocean-databases/app.json +++ b/digitalocean-databases/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Database", "official": true, + "mesh_unlisted": true, "tags": ["database", "postgresql", "mysql", "redis", "mongodb", "managed-database", "digitalocean", "backup", "scaling"], "short_description": "Manage DigitalOcean managed databases through natural language", "mesh_description": "DigitalOcean Managed Databases provide fully managed, highly available database solutions for PostgreSQL, MySQL, Redis, MongoDB, and OpenSearch. This official MCP allows you to create and manage database clusters with automatic failover, daily backups, and point-in-time recovery. Scale vertically by adjusting CPU and RAM, or horizontally by adding read replicas for improved read performance. The platform handles maintenance windows, security patches, and minor version upgrades automatically. Configure connection pooling for PostgreSQL to optimize connection management, set up trusted sources and firewall rules for security, and enable SSL/TLS encryption for data in transit. Monitor database performance with real-time metrics including CPU usage, memory consumption, disk I/O, connection count, and query performance. Manage database users and permissions, configure replication lag monitoring, and set up automated backup schedules with retention policies. The MCP supports database migrations, schema changes, and provides query optimization suggestions. Access advanced features like PostgreSQL extensions, MySQL custom parameters, Redis persistence modes, and MongoDB sharding configuration through intuitive natural language commands." diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json index 17a4bfae..829ce280 100644 --- a/github-mcp-server/app.json +++ b/github-mcp-server/app.json @@ -15,5 +15,5 @@ "tags": ["version-control", "git", "github", "repositories", "code-review", "ci-cd", "collaboration", "open-source", "devops"], "short_description": "Interact with GitHub platform through natural language", "mesh_description": "GitHub is the world's leading software development platform with over 100 million developers collaborating on open source and private projects. This official MCP Server enables natural language interaction with GitHub's comprehensive features including repository management, code hosting, and version control. Create and manage repositories with README files, .gitignore templates, and licenses. Handle issues and bugs with labels, milestones, assignees, and project boards for agile workflows. Review and merge pull requests with inline comments, suggested changes, code reviews, and automated checks. Manage branches, tags, and releases with semantic versioning and release notes. Configure GitHub Actions for CI/CD pipelines with automated testing, building, and deployment workflows. Set up branch protection rules, required reviews, and status checks for code quality. Use GitHub Projects for kanban boards and roadmap planning. Manage team access with organizations, teams, and granular repository permissions. Access code search to find specific functions, patterns, or files across repositories. Use GitHub Packages for hosting and managing Docker containers and software packages. Configure webhooks and integrations with third-party services. Access GitHub API for advanced automation and custom integrations. Perfect for development teams managing codebases, coordinating releases, and maintaining high code quality through collaborative workflows." - } +} } diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json index ad5d0f37..4a1a2f25 100644 --- a/google-bigquery-official/app.json +++ b/google-bigquery-official/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Data Analysis", "official": true, + "mesh_unlisted": true, "tags": ["data-warehouse", "sql", "analytics", "bigdata", "google-cloud", "machine-learning", "bi", "data-science", "petabyte-scale"], "short_description": "Analyze massive datasets with Google BigQuery serverless data warehouse", "mesh_description": "Google BigQuery is a fully managed, serverless data warehouse that enables super-fast SQL queries using the processing power of Google's infrastructure. This official MCP provides natural language access to BigQuery's powerful analytics capabilities, allowing you to analyze petabytes of data in seconds. Create and manage datasets, tables, and views with schema definition and partitioning strategies. Run complex SQL queries with support for standard SQL, geographic functions, machine learning functions, and user-defined functions (UDFs). Load data from various sources including Cloud Storage, Cloud SQL, Sheets, and streaming inserts. Execute federated queries that can join BigQuery data with external data sources like Cloud Storage, Bigtable, or Cloud SQL. Use BigQuery ML to create and execute machine learning models directly in SQL for tasks like classification, regression, forecasting, and recommendation. Access real-time analytics with streaming inserts and automatic table updates. Optimize costs with automatic query caching, materialized views, and partitioned tables. Monitor query performance with execution plans, slot usage, and cost estimates. Set up scheduled queries for automated data refreshes, configure access controls with IAM policies, and export results to various formats for further analysis or visualization." diff --git a/google-gke-official/app.json b/google-gke-official/app.json index d621b9fb..e9df1ff7 100644 --- a/google-gke-official/app.json +++ b/google-gke-official/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Developer Tools", "official": true, + "mesh_unlisted": true, "tags": ["kubernetes", "containers", "docker", "orchestration", "google-cloud", "gke", "devops", "microservices", "cloud-native"], "short_description": "Manage Kubernetes clusters on Google Cloud with GKE", "mesh_description": "Google Kubernetes Engine (GKE) is a managed Kubernetes service that simplifies deploying, managing, and scaling containerized applications using Google's infrastructure. This official MCP enables you to create and manage GKE clusters with autopilot or standard modes, configure node pools with custom machine types, and implement cluster autoscaling based on workload demands. Deploy applications using Kubernetes manifests, Helm charts, or Kustomize configurations. Manage pods, deployments, services, ingress, config maps, and secrets through intuitive natural language commands. Configure networking with VPC-native clusters, private clusters, and workload identity for secure service authentication. Set up horizontal pod autoscaling, vertical pod autoscaling, and cluster autoscaler for optimal resource utilization. Implement CI/CD pipelines with GKE integration, rolling updates with zero downtime, and canary deployments for gradual rollouts. Monitor cluster health, resource usage, and application performance with Cloud Monitoring and Logging integration. Configure security policies with Pod Security Standards, Binary Authorization, and network policies. Manage multi-cluster deployments with GKE Enterprise, implement service mesh with Anthos Service Mesh, and use Config Sync for GitOps workflows. Perfect for teams running cloud-native applications at scale." diff --git a/google-maps-official/app.json b/google-maps-official/app.json index 1a677a8e..8efba466 100644 --- a/google-maps-official/app.json +++ b/google-maps-official/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Mapping", "official": true, + "mesh_unlisted": true, "tags": ["maps", "geocoding", "directions", "places", "location", "google-maps", "geospatial", "navigation", "gis"], "short_description": "Access Google Maps Platform APIs through natural language", "mesh_description": "Google Maps Platform provides comprehensive mapping and location services used by millions of applications worldwide. This official MCP gives you natural language access to Google Maps APIs including geocoding for converting addresses to coordinates and reverse geocoding for coordinates to addresses. Get optimal route directions with multiple transportation modes (driving, walking, bicycling, transit) considering real-time traffic conditions, toll roads, and route alternatives. Search and discover places with detailed information including business hours, ratings, reviews, photos, and contact details. Calculate accurate distances and travel times between multiple locations using the Distance Matrix API. Optimize multi-stop routes with the Directions API for efficient delivery and logistics planning. Access detailed place information with the Places API including nearby search, text search, and place details. Use the Geolocation API to determine device location based on cell towers and WiFi access points. Implement time zone services to convert coordinates to time zones and calculate local times. Create custom maps with markers, polylines, polygons, and info windows. Access Street View imagery programmatically for location verification and virtual tours. Utilize Elevation API for topographic data and terrain information. Perfect for location-based applications, delivery services, real estate platforms, and travel apps." diff --git a/hubspot-official/app.json b/hubspot-official/app.json index 7043719a..793cd5e3 100644 --- a/hubspot-official/app.json +++ b/hubspot-official/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "CRM", "official": true, + "mesh_unlisted": true, "tags": ["crm", "marketing", "sales", "customer-service", "automation", "hubspot", "email-marketing", "lead-generation", "analytics"], "short_description": "Manage your CRM, marketing, sales, and service operations with HubSpot", "mesh_description": "HubSpot is a comprehensive customer relationship management (CRM) platform that combines marketing, sales, customer service, and content management tools in one unified system. This official MCP provides natural language access to HubSpot's powerful features, enabling you to manage the entire customer lifecycle from first touch to loyal advocate. Create and update contacts, companies, and deals with custom properties and associations. Build and manage your sales pipeline with deal stages, forecasting, and revenue tracking. Design and execute email marketing campaigns with personalization, A/B testing, and automated follow-ups. Create landing pages, forms, and CTAs to capture leads and drive conversions. Set up sophisticated workflow automation for lead nurturing, task creation, and data enrichment. Manage customer support with ticketing system, knowledge base, and live chat integration. Access detailed analytics and reports on marketing performance, sales activities, and customer satisfaction metrics. Configure lead scoring rules to prioritize high-value prospects, create custom dashboards for team visibility, and set up sequences for automated email outreach. Integrate with hundreds of apps through HubSpot's App Marketplace. Perfect for growing businesses that need an all-in-one platform to attract, engage, and delight customers at scale." diff --git a/indeed-official/app.json b/indeed-official/app.json index d6d92b69..01d7683b 100644 --- a/indeed-official/app.json +++ b/indeed-official/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Job Board", "official": true, + "mesh_unlisted": true, "tags": ["jobs", "recruitment", "hiring", "job-search", "indeed", "hr", "talent-acquisition", "careers", "employment"], "short_description": "Search and interact with job listings on the world's largest job site", "mesh_description": "Indeed is the world's #1 job site with over 350 million unique visitors per month and millions of job listings across all industries and experience levels. This official MCP enables job seekers to search and filter through comprehensive job listings using natural language queries, save favorite jobs, set up job alerts for specific criteria, and research companies with reviews and ratings from current and former employees. For employers and recruiters, the MCP provides tools to post job listings with detailed descriptions, requirements, and company information. Manage applications with applicant tracking features, review candidate profiles and resumes, schedule interviews, and communicate with applicants directly through the platform. Access powerful analytics on job posting performance including views, clicks, and application rates. Use Indeed's matching technology to find qualified candidates based on skills, experience, and location. Leverage salary insights and market data to create competitive compensation packages. Set up sponsored job postings to increase visibility and reach more qualified candidates. Configure screening questions to pre-filter applicants and save time in the hiring process. Perfect for both job seekers looking for their next opportunity and companies building their teams with top talent." diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json index 35cc1c0b..ffb6fd65 100644 --- a/mercadolibre-official/app.json +++ b/mercadolibre-official/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "E-Commerce", "official": true, + "mesh_unlisted": true, "tags": ["e-commerce", "marketplace", "online-selling", "latin-america", "mercadolibre", "retail", "inventory", "shipping", "sales"], "short_description": "Manage your e-commerce operations on Latin America's largest marketplace", "mesh_description": "Mercado Libre is Latin America's leading e-commerce platform with over 140 million active users across 18 countries including Argentina, Brazil, Mexico, Chile, Colombia, and Peru. This official MCP enables sellers to create and manage product listings with detailed descriptions, multiple images, specifications, and competitive pricing strategies. Manage your inventory across multiple warehouses and fulfillment centers with real-time stock updates. Process orders from receipt to fulfillment including order confirmation, payment verification, and shipping coordination. Integrate with Mercado Envíos for streamlined shipping with automatic label generation, tracking updates, and delivery confirmation. Handle customer inquiries and questions through the platform's messaging system with automated responses and quick replies. Monitor your seller reputation and performance metrics including response time, shipping accuracy, and customer satisfaction scores. Access detailed sales analytics with revenue reports, best-selling products, traffic sources, and conversion rates. Set up promotional campaigns with discounts, bundles, and special offers to boost sales. Manage returns and refunds efficiently while maintaining high seller ratings. Use the cross-border trade features to sell internationally within Latin America. Configure multiple payment options and installment plans to increase conversion rates. Perfect for sellers looking to grow their business in Latin American markets." diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json index ce112255..6e9077f8 100644 --- a/mercadopago-official/app.json +++ b/mercadopago-official/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Payments", "official": true, + "mesh_unlisted": true, "tags": ["payments", "fintech", "transactions", "latin-america", "mercadopago", "gateway", "subscriptions", "refunds", "checkout"], "short_description": "Process payments and manage financial operations with Latin America's leading fintech", "mesh_description": "Mercado Pago is Latin America's largest fintech platform processing billions of dollars in transactions annually across 18 countries. This official MCP provides comprehensive payment processing capabilities for credit cards, debit cards, digital wallets, bank transfers, cash payments, and cryptocurrencies. Create secure checkout experiences with customizable payment forms, one-click checkout for returning customers, and mobile-optimized payment flows. Process payments with smart routing to maximize approval rates, automatic retry logic for failed transactions, and real-time fraud detection and prevention. Manage recurring subscriptions with flexible billing cycles, automatic payment collection, and dunning management for failed payments. Handle refunds, chargebacks, and disputes efficiently with automated workflows and detailed transaction history. Access comprehensive financial analytics including transaction volumes, approval rates, payment methods distribution, and revenue trends. Configure installment payments with interest-free or interest-bearing options to increase conversion rates. Integrate with major e-commerce platforms, point-of-sale systems, and custom applications through robust APIs. Use QR code payments for in-person transactions with instant confirmation. Manage seller balances, withdrawals, and settlement schedules. Implement 3D Secure authentication for enhanced security compliance. Perfect for businesses of all sizes processing payments in Latin American markets with multi-currency support and local payment methods." diff --git a/vercel-official/app.json b/vercel-official/app.json index 5bb87e46..32285883 100644 --- a/vercel-official/app.json +++ b/vercel-official/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "Software Development", "official": true, + "mesh_unlisted": true, "tags": ["deployment", "frontend", "nextjs", "serverless", "vercel", "jamstack", "cdn", "edge-functions", "ci-cd"], "short_description": "Deploy and manage your frontend applications with Vercel", "mesh_description": "Vercel is the platform for frontend developers, providing zero-configuration deployments for modern web applications with automatic HTTPS, CDN, and serverless functions. This official MCP enables you to deploy Next.js, React, Vue, Angular, Svelte, and static sites with git integration for automatic deployments on every push. Experience instant rollbacks, preview deployments for every pull request, and production deployments on merge. Manage custom domains with automatic SSL certificate provisioning, DNS configuration, and domain redirects. Configure environment variables per deployment environment (production, preview, development) with encrypted secrets management. Deploy Edge Functions that run on Vercel's global edge network for ultra-low latency, and Serverless Functions for backend API routes with automatic scaling. Access real-time Web Analytics with Core Web Vitals tracking, page performance metrics, and visitor insights without impacting performance. Use Edge Config for ultra-low-latency data access at the edge, and KV for serverless Redis-compatible storage. Configure build settings including framework presets, custom build commands, and output directories. Set up team collaboration with role-based access control, audit logs, and deployment protection rules. Integrate with monitoring tools, implement A/B testing with Edge Middleware, and optimize images automatically with Vercel Image Optimization. Perfect for teams building high-performance web applications." diff --git a/wix-official/app.json b/wix-official/app.json index 937ca5b2..4c9a2145 100644 --- a/wix-official/app.json +++ b/wix-official/app.json @@ -12,6 +12,7 @@ "metadata": { "category": "CMS", "official": true, + "mesh_unlisted": true, "tags": ["website-builder", "cms", "e-commerce", "no-code", "wix", "drag-and-drop", "templates", "blogging", "online-store"], "short_description": "Build and manage websites with Wix's powerful no-code platform", "mesh_description": "Wix is a leading website builder platform with over 200 million users worldwide, offering powerful tools for creating professional websites without coding. This official MCP provides natural language access to Wix's comprehensive features including creating and editing pages with drag-and-drop functionality, managing site structure and navigation, and customizing designs with thousands of templates. Build complete e-commerce stores with product catalogs, inventory management, shopping cart, checkout process, and payment gateway integrations including PayPal, Stripe, and Wix Payments. Create and manage blog content with SEO optimization, scheduling, categories, and social media integration. Use Wix's CMS capabilities to create custom databases and dynamic pages for portfolios, directories, and content-rich sites. Add interactive elements like forms, galleries, video backgrounds, animations, and custom interactions without coding. Configure SEO settings including meta tags, structured data, sitemaps, and mobile optimization for better search rankings. Manage domain names, SSL certificates, and email accounts directly from the platform. Use Wix Apps marketplace to extend functionality with thousands of integrations for marketing, analytics, bookings, events, and more. Create member areas with user authentication, roles, and permissions. Implement marketing tools including email campaigns, social media integration, and marketing automation. Access analytics and insights on visitor behavior, conversion rates, and site performance. Perfect for small businesses, entrepreneurs, and creatives building their online presence." From f055266ceebdb8e832a6148c2d9c53efe388321d Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Fri, 9 Jan 2026 10:08:58 -0300 Subject: [PATCH 26/31] Update app.json files to change category to categories for consistency across various services --- cloudflare-docs/app.json | 2 +- cloudflare-observability/app.json | 2 +- cloudflare-workers/app.json | 2 +- digitalocean-apps/app.json | 2 +- digitalocean-databases/app.json | 2 +- exa-search/app.json | 2 +- github-mcp-server/app.json | 2 +- google-bigquery-official/app.json | 2 +- google-gke-official/app.json | 2 +- google-maps-official/app.json | 2 +- grain-official/app.json | 2 +- hubspot-official/app.json | 2 +- indeed-official/app.json | 2 +- jam-dev/app.json | 2 +- mercadolibre-official/app.json | 2 +- mercadopago-official/app.json | 2 +- vercel-official/app.json | 2 +- wix-official/app.json | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json index 4bc8b5f0..1efe064a 100644 --- a/cloudflare-docs/app.json +++ b/cloudflare-docs/app.json @@ -10,7 +10,7 @@ "icon": "https://www.cloudflare.com/favicon.ico", "unlisted": false, "metadata": { - "category": "Documentation", + "categories": "Documentation", "official": true, "mesh_unlisted": true, "tags": ["documentation", "api-reference", "guides", "tutorials", "cloudflare", "learning", "support", "knowledge-base"], diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json index 34dc3e44..17daa4d1 100644 --- a/cloudflare-observability/app.json +++ b/cloudflare-observability/app.json @@ -10,7 +10,7 @@ "icon": "https://www.cloudflare.com/favicon.ico", "unlisted": false, "metadata": { - "category": "Observability", + "categories": "Observability", "official": true, "mesh_unlisted": true, "tags": ["monitoring", "logs", "analytics", "metrics", "tracing", "cloudflare", "observability", "performance", "debugging"], diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json index c005b750..f17fba15 100644 --- a/cloudflare-workers/app.json +++ b/cloudflare-workers/app.json @@ -10,7 +10,7 @@ "icon": "https://www.cloudflare.com/favicon.ico", "unlisted": false, "metadata": { - "category": "Software Development", + "categories": "Software Development", "official": true, "mesh_unlisted": true, "tags": ["serverless", "edge-computing", "javascript", "workers", "kv", "durable-objects", "cloudflare", "deployment", "functions"], diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json index 42e6353c..e449d276 100644 --- a/digitalocean-apps/app.json +++ b/digitalocean-apps/app.json @@ -10,7 +10,7 @@ "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", "unlisted": false, "metadata": { - "category": "Software Development", + "categories": "Software Development", "official": true, "mesh_unlisted": true, "tags": ["deployment", "paas", "containers", "hosting", "digitalocean", "ci-cd", "scaling", "app-platform", "devops"], diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json index c63d8754..9dcdb0cd 100644 --- a/digitalocean-databases/app.json +++ b/digitalocean-databases/app.json @@ -10,7 +10,7 @@ "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", "unlisted": false, "metadata": { - "category": "Database", + "categories": "Database", "official": true, "mesh_unlisted": true, "tags": ["database", "postgresql", "mysql", "redis", "mongodb", "managed-database", "digitalocean", "backup", "scaling"], diff --git a/exa-search/app.json b/exa-search/app.json index 19808ce3..4215309d 100644 --- a/exa-search/app.json +++ b/exa-search/app.json @@ -10,7 +10,7 @@ "icon": "https://assets.decocache.com/decocms/3638f940-f5b8-463f-8724-f092c82d1f4c/exa.jpeg", "unlisted": false, "metadata": { - "category": "Search", + "categories": "Search", "official": true, "tags": ["search", "ai-search", "semantic-search", "web-search", "research", "exa", "knowledge", "discovery", "nlp"], "short_description": "AI-powered semantic search engine for finding high-quality content", diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json index 829ce280..08bc9fd0 100644 --- a/github-mcp-server/app.json +++ b/github-mcp-server/app.json @@ -10,7 +10,7 @@ "icon": "https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png", "unlisted": false, "metadata": { - "category": "Developer Tools", + "categories": "Developer Tools", "official": true, "tags": ["version-control", "git", "github", "repositories", "code-review", "ci-cd", "collaboration", "open-source", "devops"], "short_description": "Interact with GitHub platform through natural language", diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json index 4a1a2f25..59ec1320 100644 --- a/google-bigquery-official/app.json +++ b/google-bigquery-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.gstatic.com/images/branding/product/2x/bigquery_64dp.png", "unlisted": false, "metadata": { - "category": "Data Analysis", + "categories": "Data Analysis", "official": true, "mesh_unlisted": true, "tags": ["data-warehouse", "sql", "analytics", "bigdata", "google-cloud", "machine-learning", "bi", "data-science", "petabyte-scale"], diff --git a/google-gke-official/app.json b/google-gke-official/app.json index e9df1ff7..0cb11d63 100644 --- a/google-gke-official/app.json +++ b/google-gke-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.gstatic.com/images/branding/product/2x/gke_64dp.png", "unlisted": false, "metadata": { - "category": "Developer Tools", + "categories": "Developer Tools", "official": true, "mesh_unlisted": true, "tags": ["kubernetes", "containers", "docker", "orchestration", "google-cloud", "gke", "devops", "microservices", "cloud-native"], diff --git a/google-maps-official/app.json b/google-maps-official/app.json index 8efba466..17af08f6 100644 --- a/google-maps-official/app.json +++ b/google-maps-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.gstatic.com/images/branding/product/2x/maps_64dp.png", "unlisted": false, "metadata": { - "category": "Mapping", + "categories": "Mapping", "official": true, "mesh_unlisted": true, "tags": ["maps", "geocoding", "directions", "places", "location", "google-maps", "geospatial", "navigation", "gis"], diff --git a/grain-official/app.json b/grain-official/app.json index 9378316e..976e5110 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -14,7 +14,7 @@ "icon": "https://assets.decocache.com/mcp/1bfc7176-e7be-487c-83e6-4b9e970a8e10/Grain.svg", "unlisted": false, "metadata": { - "category": "Collaboration", + "categories": "Collaboration", "official": true, "tags": ["meetings", "transcription", "recording", "video", "collaboration", "grain", "ai-notes", "insights", "productivity"], "short_description": "Record, transcribe, and analyze meetings with Grain", diff --git a/hubspot-official/app.json b/hubspot-official/app.json index 793cd5e3..b9b01fb5 100644 --- a/hubspot-official/app.json +++ b/hubspot-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.hubspot.com/favicon.ico", "unlisted": false, "metadata": { - "category": "CRM", + "categories": "CRM", "official": true, "mesh_unlisted": true, "tags": ["crm", "marketing", "sales", "customer-service", "automation", "hubspot", "email-marketing", "lead-generation", "analytics"], diff --git a/indeed-official/app.json b/indeed-official/app.json index 01d7683b..046b0f4c 100644 --- a/indeed-official/app.json +++ b/indeed-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.indeed.com/favicon.ico", "unlisted": false, "metadata": { - "category": "Job Board", + "categories": "Job Board", "official": true, "mesh_unlisted": true, "tags": ["jobs", "recruitment", "hiring", "job-search", "indeed", "hr", "talent-acquisition", "careers", "employment"], diff --git a/jam-dev/app.json b/jam-dev/app.json index 7dec5d0b..889a3bd3 100644 --- a/jam-dev/app.json +++ b/jam-dev/app.json @@ -10,7 +10,7 @@ "icon": "https://jam.dev/favicon.ico", "unlisted": false, "metadata": { - "category": "Software Development", + "categories": "Software Development", "official": true, "tags": ["debugging", "bug-tracking", "developer-tools", "qa", "testing", "jam", "screenshots", "browser-extension", "collaboration"], "short_description": "Debug faster with instant comprehensive bug reports", diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json index ffb6fd65..52a1b637 100644 --- a/mercadolibre-official/app.json +++ b/mercadolibre-official/app.json @@ -10,7 +10,7 @@ "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", "unlisted": false, "metadata": { - "category": "E-Commerce", + "categories": "E-Commerce", "official": true, "mesh_unlisted": true, "tags": ["e-commerce", "marketplace", "online-selling", "latin-america", "mercadolibre", "retail", "inventory", "shipping", "sales"], diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json index 6e9077f8..ddba674d 100644 --- a/mercadopago-official/app.json +++ b/mercadopago-official/app.json @@ -10,7 +10,7 @@ "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", "unlisted": false, "metadata": { - "category": "Payments", + "categories": "Payments", "official": true, "mesh_unlisted": true, "tags": ["payments", "fintech", "transactions", "latin-america", "mercadopago", "gateway", "subscriptions", "refunds", "checkout"], diff --git a/vercel-official/app.json b/vercel-official/app.json index 32285883..76b74589 100644 --- a/vercel-official/app.json +++ b/vercel-official/app.json @@ -10,7 +10,7 @@ "icon": "https://vercel.com/favicon.ico", "unlisted": false, "metadata": { - "category": "Software Development", + "categories": "Software Development", "official": true, "mesh_unlisted": true, "tags": ["deployment", "frontend", "nextjs", "serverless", "vercel", "jamstack", "cdn", "edge-functions", "ci-cd"], diff --git a/wix-official/app.json b/wix-official/app.json index 4c9a2145..0cae7b29 100644 --- a/wix-official/app.json +++ b/wix-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.wix.com/favicon.ico", "unlisted": false, "metadata": { - "category": "CMS", + "categories": "CMS", "official": true, "mesh_unlisted": true, "tags": ["website-builder", "cms", "e-commerce", "no-code", "wix", "drag-and-drop", "templates", "blogging", "online-store"], From 21a54d1f04fdbca16312a621278b4a7f609d461c Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Fri, 9 Jan 2026 10:15:26 -0300 Subject: [PATCH 27/31] Enhance app.json files for various services by adding metadata sections, including categories, tags, short descriptions, and detailed mesh descriptions for improved context and usability --- content-scraper/app.json | 9 ++++++++- google-big-query/app.json | 9 ++++++++- google-calendar/app.json | 9 ++++++++- google-tag-manager/app.json | 11 +++++++++-- meta-ads/app.json | 10 +++++++++- openrouter/app.json | 10 +++++++++- registry/app.json | 11 +++++++++-- 7 files changed, 60 insertions(+), 9 deletions(-) diff --git a/content-scraper/app.json b/content-scraper/app.json index 40daaa31..0744f00a 100644 --- a/content-scraper/app.json +++ b/content-scraper/app.json @@ -8,5 +8,12 @@ }, "description": "Scrape web content from URLs using n8n workflow automation.", "icon": "https://assets.decocache.com/mcp/content-scraper-icon.svg", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": "Data Extraction", + "official": false, + "tags": ["scraping", "web-scraping", "content-extraction", "automation", "n8n", "data-collection"], + "short_description": "Scrape web content from URLs using n8n workflow automation.", + "mesh_description": "The Content Scraper MCP provides powerful web scraping capabilities powered by n8n workflow automation, enabling AI agents to extract structured and unstructured content from websites. This MCP supports scraping HTML content, extracting specific elements using CSS selectors or XPath, handling JavaScript-rendered pages, following pagination, and processing dynamic content. It includes built-in features for rate limiting, user-agent rotation, proxy support, and anti-bot detection bypass. The integration leverages n8n's workflow engine for complex scraping scenarios including multi-step extraction, data transformation, and conditional logic. Perfect for market research, competitive intelligence, content aggregation, price monitoring, lead generation, or any application requiring automated web data collection. Supports various output formats and can handle single-page scraping or bulk URL processing. Ideal for building data pipelines, research tools, or content monitoring systems." + } } diff --git a/google-big-query/app.json b/google-big-query/app.json index 1be0887c..d96eadbb 100644 --- a/google-big-query/app.json +++ b/google-big-query/app.json @@ -8,6 +8,13 @@ }, "description": "Query and manage Google BigQuery datasets. Execute SQL queries, list datasets and tables, and explore table schemas.", "icon": "https://cdn.worldvectorlogo.com/logos/google-bigquery-logo-1.svg", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": "Data Analysis", + "official": false, + "tags": ["google", "bigquery", "sql", "data-warehouse", "analytics", "big-data", "cloud"], + "short_description": "Query and manage Google BigQuery datasets. Execute SQL queries, list datasets and tables, and explore table schemas.", + "mesh_description": "The Google BigQuery MCP provides comprehensive access to Google's serverless data warehouse platform, enabling AI agents to execute SQL queries, manage datasets, explore table schemas, and analyze large-scale data. This MCP supports running standard SQL and legacy SQL queries, retrieving query results, managing BigQuery datasets and tables, exploring table metadata and column definitions, and accessing query job history. It enables advanced data analytics workflows including cross-dataset joins, complex aggregations, time-series analysis, and integration with machine learning models. The integration is designed for data analysts, data scientists, and business intelligence applications that need programmatic access to BigQuery for data exploration, reporting, or automated analytics pipelines. Supports query optimization, cost management through query previews, and streaming data access. Ideal for building data-driven AI applications, automated reporting systems, or intelligent data exploration tools." + } } diff --git a/google-calendar/app.json b/google-calendar/app.json index 7788d8e1..1ffd2352 100644 --- a/google-calendar/app.json +++ b/google-calendar/app.json @@ -8,6 +8,13 @@ }, "description": "Integrate and manage your Google Calendar. Create, edit and delete events, check availability and sync your calendars.", "icon": "https://assets.decocache.com/mcp/b5fffe71-647a-461c-aa39-3da07b86cc96/Google-Meets.svg", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": "Productivity", + "official": false, + "tags": ["google", "calendar", "scheduling", "events", "meetings", "productivity", "time-management"], + "short_description": "Integrate and manage your Google Calendar. Create, edit and delete events, check availability and sync your calendars.", + "mesh_description": "The Google Calendar MCP provides comprehensive integration with Google Calendar, enabling full programmatic control over calendar events, schedules, and availability management. This MCP allows AI agents to create, read, update, and delete calendar events, check user availability across multiple calendars, manage event attendees and invitations, set up recurring events, and configure event reminders and notifications. It supports advanced scheduling features including finding optimal meeting times, managing calendar sharing and permissions, handling multiple calendars, and synchronizing events across different time zones. The integration is perfect for building intelligent scheduling assistants, automated meeting coordinators, calendar-based workflow triggers, and personal productivity tools. Ideal for teams and individuals who need to automate calendar management, integrate scheduling into business processes, or build calendar-aware applications. Provides secure OAuth-based authentication for calendar access." + } } diff --git a/google-tag-manager/app.json b/google-tag-manager/app.json index 619e33a3..93d99f86 100644 --- a/google-tag-manager/app.json +++ b/google-tag-manager/app.json @@ -7,6 +7,13 @@ "url": "https://sites-google-tag-manager.decocache.com/mcp" }, "description": "Manage Google Tag Manager resources including accounts, containers, workspaces, tags, triggers and variables via API.", - "icon": "https://assets.decocache.com/decocms/9636f785-2d20-4b90-8fd8-6bd8f0b29afb/google-tag-manager.jpg", - "unlisted": false + "icon": "https://assets.decocache.com/decocms/9636f785-2d20-4b90-8fd8-6bd8-6bd8f0b29afb/google-tag-manager.jpg", + "unlisted": false, + "metadata": { + "categories": "Analytics", + "official": false, + "tags": ["google", "tag-manager", "gtm", "analytics", "tracking", "marketing"], + "short_description": "Manage Google Tag Manager resources including accounts, containers, workspaces, tags, triggers and variables via API.", + "mesh_description": "The Google Tag Manager MCP provides comprehensive integration with GTM's API, enabling programmatic management of all aspects of tag management infrastructure. This MCP allows AI agents and automation systems to create, read, update, and delete GTM resources including accounts, containers, workspaces, tags, triggers, and variables. It supports complete workspace management workflows, from creating new workspaces for isolated development to publishing changes to production containers. The integration enables automated tag deployment, bulk tag operations, configuration backups, and cross-container synchronization. Perfect for marketing teams, web analysts, and developers who need to manage tracking implementations at scale, automate tag deployments across multiple properties, or integrate GTM management into their CI/CD pipelines. Supports all GTM resource types and enables advanced automation scenarios for tag governance and compliance." + } } diff --git a/meta-ads/app.json b/meta-ads/app.json index 0e052706..4334b713 100644 --- a/meta-ads/app.json +++ b/meta-ads/app.json @@ -1,12 +1,20 @@ { "scopeName": "deco", "name": "meta-ads", + "friendlyName": "Meta Ads Analytics", "connection": { "type": "HTTP", "url": "https://sites-meta-ads.decocache.com/mcp" }, "description": "Meta Ads Analytics - Analyze performance of Meta/Facebook advertising campaigns with detailed insights and metrics", "icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Facebook_Logo_%282019%29.png/1200px-Facebook_Logo_%282019%29.png", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": "Marketing", + "official": false, + "tags": ["meta", "facebook", "instagram", "ads", "advertising", "analytics", "marketing", "campaigns"], + "short_description": "Meta Ads Analytics - Analyze performance of Meta/Facebook advertising campaigns with detailed insights and metrics", + "mesh_description": "The Meta Ads Analytics MCP provides deep integration with Meta's advertising platform, offering comprehensive tools to analyze, monitor, and optimize advertising campaigns across Facebook and Instagram. This MCP enables AI agents to retrieve detailed campaign performance metrics, including impressions, clicks, conversions, cost data, and audience engagement statistics. It supports querying campaign hierarchies (campaigns, ad sets, ads), accessing demographic breakdowns, analyzing time-series performance data, and generating custom reports. The integration allows for automated performance monitoring, anomaly detection in ad spend, ROI analysis, and budget optimization recommendations. Ideal for digital marketers, advertising agencies, and data analysts who need to track campaign performance, generate client reports, or build automated optimization workflows. Provides access to Meta's Marketing API for programmatic campaign insights and decision-making support." + } } diff --git a/openrouter/app.json b/openrouter/app.json index ae28c4fa..48f5ffa7 100644 --- a/openrouter/app.json +++ b/openrouter/app.json @@ -1,11 +1,19 @@ { "scopeName": "deco", "name": "openrouter", + "friendlyName": "OpenRouter", "connection": { "type": "HTTP", "url": "https://sites-openrouter.decocache.com/mcp" }, "description": "OpenRouter App Connection for LLM uses.", "icon": "https://assets.decocache.com/decocms/b2e2f64f-6025-45f7-9e8c-3b3ebdd073d8/openrouter_logojpg.jpg", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": "AI", + "official": false, + "tags": ["openrouter", "llm", "ai", "language-models", "chat", "completion"], + "short_description": "OpenRouter App Connection for LLM uses.", + "mesh_description": "The OpenRouter MCP provides a unified gateway to access multiple large language models (LLMs) through a single integration point. OpenRouter aggregates various AI model providers including OpenAI, Anthropic, Google, Meta, and many others, offering a standardized API interface for chat completions and text generation. This MCP enables AI agents to dynamically select and utilize different LLMs based on specific requirements such as cost, speed, capability, or context window size. It supports model routing, fallback strategies, cost tracking, and usage analytics. The integration is perfect for applications that need flexibility in model selection, want to optimize costs by using the most appropriate model for each task, or require high availability through automatic failover between providers. Ideal for developers building AI-powered applications, chatbots, content generation systems, or multi-model comparison tools." + } } \ No newline at end of file diff --git a/registry/app.json b/registry/app.json index 3c5c08bf..57f75c47 100644 --- a/registry/app.json +++ b/registry/app.json @@ -9,7 +9,14 @@ "repository": { "url": "https://github.com/decocms/mcps/tree/main/registry" }, - "description": "A registry translation server that normalizes third-party MCP registries into this system’s format. When no external registry URL is supplied, the server automatically falls back to the official MCP store.", + "description": "A registry translation server that normalizes third-party MCP registries into this system's format. When no external registry URL is supplied, the server automatically falls back to the official MCP store.", "icon": "https://assets.decocache.com/decocms/cd7ca472-0f72-463a-b0de-6e44bdd0f9b4/mcp.png", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": "Developer Tools", + "official": false, + "tags": ["mcp", "registry", "discovery", "marketplace", "integration", "catalog"], + "short_description": "A registry translation server that normalizes third-party MCP registries into this system's format. When no external registry URL is supplied, the server automatically falls back to the official MCP store.", + "mesh_description": "The MCP Registry is a centralized discovery and translation service that aggregates and normalizes MCP integrations from multiple sources into a unified format. This MCP acts as a registry gateway, enabling AI agents and applications to discover available MCP integrations, retrieve their metadata and schemas, and connect to them programmatically. It supports querying MCPs by category, tags, capabilities, or search terms, fetching detailed integration documentation, and resolving MCP endpoints. The registry automatically translates between different MCP registry formats, ensuring compatibility across various MCP ecosystems. When no external registry URL is provided, it defaults to the official MCP store. Ideal for building MCP marketplaces, integration discovery tools, or applications that need dynamic MCP loading and connection management. Provides a standardized interface for MCP catalog management and distribution." + } } From e678f872bcfda3b073dcca9dc009c4c0c3c028cd Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Fri, 9 Jan 2026 10:26:16 -0300 Subject: [PATCH 28/31] Refactor app.json files to change category values from strings to arrays for consistency across multiple services --- cloudflare-docs/app.json | 2 +- cloudflare-observability/app.json | 2 +- cloudflare-workers/app.json | 2 +- content-scraper/app.json | 2 +- digitalocean-apps/app.json | 2 +- digitalocean-databases/app.json | 2 +- exa-search/app.json | 2 +- github-mcp-server/app.json | 2 +- google-big-query/app.json | 2 +- google-bigquery-official/app.json | 2 +- google-calendar/app.json | 2 +- google-gke-official/app.json | 2 +- google-maps-official/app.json | 2 +- google-tag-manager/app.json | 4 ++-- grain-official/app.json | 2 +- hubspot-official/app.json | 2 +- indeed-official/app.json | 2 +- jam-dev/app.json | 2 +- mercadolibre-official/app.json | 2 +- mercadopago-official/app.json | 2 +- meta-ads/app.json | 2 +- openrouter/app.json | 2 +- registry/app.json | 2 +- scripts/build-mcp.ts | 20 ++++++++++---------- vercel-official/app.json | 2 +- wix-official/app.json | 2 +- 26 files changed, 36 insertions(+), 36 deletions(-) diff --git a/cloudflare-docs/app.json b/cloudflare-docs/app.json index 1efe064a..dff529ea 100644 --- a/cloudflare-docs/app.json +++ b/cloudflare-docs/app.json @@ -10,7 +10,7 @@ "icon": "https://www.cloudflare.com/favicon.ico", "unlisted": false, "metadata": { - "categories": "Documentation", + "categories": ["Documentation"], "official": true, "mesh_unlisted": true, "tags": ["documentation", "api-reference", "guides", "tutorials", "cloudflare", "learning", "support", "knowledge-base"], diff --git a/cloudflare-observability/app.json b/cloudflare-observability/app.json index 17daa4d1..c042a14f 100644 --- a/cloudflare-observability/app.json +++ b/cloudflare-observability/app.json @@ -10,7 +10,7 @@ "icon": "https://www.cloudflare.com/favicon.ico", "unlisted": false, "metadata": { - "categories": "Observability", + "categories": ["Observability"], "official": true, "mesh_unlisted": true, "tags": ["monitoring", "logs", "analytics", "metrics", "tracing", "cloudflare", "observability", "performance", "debugging"], diff --git a/cloudflare-workers/app.json b/cloudflare-workers/app.json index f17fba15..89fe2c5e 100644 --- a/cloudflare-workers/app.json +++ b/cloudflare-workers/app.json @@ -10,7 +10,7 @@ "icon": "https://www.cloudflare.com/favicon.ico", "unlisted": false, "metadata": { - "categories": "Software Development", + "categories": ["Software Development"], "official": true, "mesh_unlisted": true, "tags": ["serverless", "edge-computing", "javascript", "workers", "kv", "durable-objects", "cloudflare", "deployment", "functions"], diff --git a/content-scraper/app.json b/content-scraper/app.json index 0744f00a..9237c9ff 100644 --- a/content-scraper/app.json +++ b/content-scraper/app.json @@ -10,7 +10,7 @@ "icon": "https://assets.decocache.com/mcp/content-scraper-icon.svg", "unlisted": false, "metadata": { - "categories": "Data Extraction", + "categories": ["Data Extraction"], "official": false, "tags": ["scraping", "web-scraping", "content-extraction", "automation", "n8n", "data-collection"], "short_description": "Scrape web content from URLs using n8n workflow automation.", diff --git a/digitalocean-apps/app.json b/digitalocean-apps/app.json index e449d276..f23b406f 100644 --- a/digitalocean-apps/app.json +++ b/digitalocean-apps/app.json @@ -10,7 +10,7 @@ "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", "unlisted": false, "metadata": { - "categories": "Software Development", + "categories": ["Software Development"], "official": true, "mesh_unlisted": true, "tags": ["deployment", "paas", "containers", "hosting", "digitalocean", "ci-cd", "scaling", "app-platform", "devops"], diff --git a/digitalocean-databases/app.json b/digitalocean-databases/app.json index 9dcdb0cd..c7415e4c 100644 --- a/digitalocean-databases/app.json +++ b/digitalocean-databases/app.json @@ -10,7 +10,7 @@ "icon": "https://www.digitalocean.com/_next/static/media/logo.0f4b57fd.svg", "unlisted": false, "metadata": { - "categories": "Database", + "categories": ["Database"], "official": true, "mesh_unlisted": true, "tags": ["database", "postgresql", "mysql", "redis", "mongodb", "managed-database", "digitalocean", "backup", "scaling"], diff --git a/exa-search/app.json b/exa-search/app.json index 4215309d..5d48a75d 100644 --- a/exa-search/app.json +++ b/exa-search/app.json @@ -10,7 +10,7 @@ "icon": "https://assets.decocache.com/decocms/3638f940-f5b8-463f-8724-f092c82d1f4c/exa.jpeg", "unlisted": false, "metadata": { - "categories": "Search", + "categories": ["Search"], "official": true, "tags": ["search", "ai-search", "semantic-search", "web-search", "research", "exa", "knowledge", "discovery", "nlp"], "short_description": "AI-powered semantic search engine for finding high-quality content", diff --git a/github-mcp-server/app.json b/github-mcp-server/app.json index 08bc9fd0..93d6c42a 100644 --- a/github-mcp-server/app.json +++ b/github-mcp-server/app.json @@ -10,7 +10,7 @@ "icon": "https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png", "unlisted": false, "metadata": { - "categories": "Developer Tools", + "categories": ["Developer Tools"], "official": true, "tags": ["version-control", "git", "github", "repositories", "code-review", "ci-cd", "collaboration", "open-source", "devops"], "short_description": "Interact with GitHub platform through natural language", diff --git a/google-big-query/app.json b/google-big-query/app.json index d96eadbb..21aaac13 100644 --- a/google-big-query/app.json +++ b/google-big-query/app.json @@ -10,7 +10,7 @@ "icon": "https://cdn.worldvectorlogo.com/logos/google-bigquery-logo-1.svg", "unlisted": false, "metadata": { - "categories": "Data Analysis", + "categories": ["Data Analysis"], "official": false, "tags": ["google", "bigquery", "sql", "data-warehouse", "analytics", "big-data", "cloud"], "short_description": "Query and manage Google BigQuery datasets. Execute SQL queries, list datasets and tables, and explore table schemas.", diff --git a/google-bigquery-official/app.json b/google-bigquery-official/app.json index 59ec1320..08135556 100644 --- a/google-bigquery-official/app.json +++ b/google-bigquery-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.gstatic.com/images/branding/product/2x/bigquery_64dp.png", "unlisted": false, "metadata": { - "categories": "Data Analysis", + "categories": ["Data Analysis"], "official": true, "mesh_unlisted": true, "tags": ["data-warehouse", "sql", "analytics", "bigdata", "google-cloud", "machine-learning", "bi", "data-science", "petabyte-scale"], diff --git a/google-calendar/app.json b/google-calendar/app.json index 1ffd2352..69475c39 100644 --- a/google-calendar/app.json +++ b/google-calendar/app.json @@ -10,7 +10,7 @@ "icon": "https://assets.decocache.com/mcp/b5fffe71-647a-461c-aa39-3da07b86cc96/Google-Meets.svg", "unlisted": false, "metadata": { - "categories": "Productivity", + "categories": ["Productivity"], "official": false, "tags": ["google", "calendar", "scheduling", "events", "meetings", "productivity", "time-management"], "short_description": "Integrate and manage your Google Calendar. Create, edit and delete events, check availability and sync your calendars.", diff --git a/google-gke-official/app.json b/google-gke-official/app.json index 0cb11d63..3579fdbe 100644 --- a/google-gke-official/app.json +++ b/google-gke-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.gstatic.com/images/branding/product/2x/gke_64dp.png", "unlisted": false, "metadata": { - "categories": "Developer Tools", + "categories": ["Developer Tools"], "official": true, "mesh_unlisted": true, "tags": ["kubernetes", "containers", "docker", "orchestration", "google-cloud", "gke", "devops", "microservices", "cloud-native"], diff --git a/google-maps-official/app.json b/google-maps-official/app.json index 17af08f6..d14e3475 100644 --- a/google-maps-official/app.json +++ b/google-maps-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.gstatic.com/images/branding/product/2x/maps_64dp.png", "unlisted": false, "metadata": { - "categories": "Mapping", + "categories": ["Mapping"], "official": true, "mesh_unlisted": true, "tags": ["maps", "geocoding", "directions", "places", "location", "google-maps", "geospatial", "navigation", "gis"], diff --git a/google-tag-manager/app.json b/google-tag-manager/app.json index 93d99f86..ff98c803 100644 --- a/google-tag-manager/app.json +++ b/google-tag-manager/app.json @@ -9,8 +9,8 @@ "description": "Manage Google Tag Manager resources including accounts, containers, workspaces, tags, triggers and variables via API.", "icon": "https://assets.decocache.com/decocms/9636f785-2d20-4b90-8fd8-6bd8-6bd8f0b29afb/google-tag-manager.jpg", "unlisted": false, - "metadata": { - "categories": "Analytics", + "metadata": { + "categories": ["Analytics"], "official": false, "tags": ["google", "tag-manager", "gtm", "analytics", "tracking", "marketing"], "short_description": "Manage Google Tag Manager resources including accounts, containers, workspaces, tags, triggers and variables via API.", diff --git a/grain-official/app.json b/grain-official/app.json index 976e5110..a78b7115 100644 --- a/grain-official/app.json +++ b/grain-official/app.json @@ -14,7 +14,7 @@ "icon": "https://assets.decocache.com/mcp/1bfc7176-e7be-487c-83e6-4b9e970a8e10/Grain.svg", "unlisted": false, "metadata": { - "categories": "Collaboration", + "categories": ["Collaboration"], "official": true, "tags": ["meetings", "transcription", "recording", "video", "collaboration", "grain", "ai-notes", "insights", "productivity"], "short_description": "Record, transcribe, and analyze meetings with Grain", diff --git a/hubspot-official/app.json b/hubspot-official/app.json index b9b01fb5..d3f02fe5 100644 --- a/hubspot-official/app.json +++ b/hubspot-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.hubspot.com/favicon.ico", "unlisted": false, "metadata": { - "categories": "CRM", + "categories": ["CRM"], "official": true, "mesh_unlisted": true, "tags": ["crm", "marketing", "sales", "customer-service", "automation", "hubspot", "email-marketing", "lead-generation", "analytics"], diff --git a/indeed-official/app.json b/indeed-official/app.json index 046b0f4c..bfa22b2d 100644 --- a/indeed-official/app.json +++ b/indeed-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.indeed.com/favicon.ico", "unlisted": false, "metadata": { - "categories": "Job Board", + "categories": ["Job Board"], "official": true, "mesh_unlisted": true, "tags": ["jobs", "recruitment", "hiring", "job-search", "indeed", "hr", "talent-acquisition", "careers", "employment"], diff --git a/jam-dev/app.json b/jam-dev/app.json index 889a3bd3..24e8aa17 100644 --- a/jam-dev/app.json +++ b/jam-dev/app.json @@ -10,7 +10,7 @@ "icon": "https://jam.dev/favicon.ico", "unlisted": false, "metadata": { - "categories": "Software Development", + "categories": ["Software Development"], "official": true, "tags": ["debugging", "bug-tracking", "developer-tools", "qa", "testing", "jam", "screenshots", "browser-extension", "collaboration"], "short_description": "Debug faster with instant comprehensive bug reports", diff --git a/mercadolibre-official/app.json b/mercadolibre-official/app.json index 52a1b637..2ac93b8a 100644 --- a/mercadolibre-official/app.json +++ b/mercadolibre-official/app.json @@ -10,7 +10,7 @@ "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", "unlisted": false, "metadata": { - "categories": "E-Commerce", + "categories": ["E-Commerce"], "official": true, "mesh_unlisted": true, "tags": ["e-commerce", "marketplace", "online-selling", "latin-america", "mercadolibre", "retail", "inventory", "shipping", "sales"], diff --git a/mercadopago-official/app.json b/mercadopago-official/app.json index ddba674d..5f0d2302 100644 --- a/mercadopago-official/app.json +++ b/mercadopago-official/app.json @@ -10,7 +10,7 @@ "icon": "https://http2.mlstatic.com/frontend-assets/ui-navigation/5.19.1/mercadolibre/favicon.svg", "unlisted": false, "metadata": { - "categories": "Payments", + "categories": ["Payments"], "official": true, "mesh_unlisted": true, "tags": ["payments", "fintech", "transactions", "latin-america", "mercadopago", "gateway", "subscriptions", "refunds", "checkout"], diff --git a/meta-ads/app.json b/meta-ads/app.json index 4334b713..03732c51 100644 --- a/meta-ads/app.json +++ b/meta-ads/app.json @@ -10,7 +10,7 @@ "icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Facebook_Logo_%282019%29.png/1200px-Facebook_Logo_%282019%29.png", "unlisted": false, "metadata": { - "categories": "Marketing", + "categories": ["Marketing"], "official": false, "tags": ["meta", "facebook", "instagram", "ads", "advertising", "analytics", "marketing", "campaigns"], "short_description": "Meta Ads Analytics - Analyze performance of Meta/Facebook advertising campaigns with detailed insights and metrics", diff --git a/openrouter/app.json b/openrouter/app.json index 48f5ffa7..0f1cc4a0 100644 --- a/openrouter/app.json +++ b/openrouter/app.json @@ -10,7 +10,7 @@ "icon": "https://assets.decocache.com/decocms/b2e2f64f-6025-45f7-9e8c-3b3ebdd073d8/openrouter_logojpg.jpg", "unlisted": false, "metadata": { - "categories": "AI", + "categories": ["AI"], "official": false, "tags": ["openrouter", "llm", "ai", "language-models", "chat", "completion"], "short_description": "OpenRouter App Connection for LLM uses.", diff --git a/registry/app.json b/registry/app.json index 57f75c47..2026835f 100644 --- a/registry/app.json +++ b/registry/app.json @@ -13,7 +13,7 @@ "icon": "https://assets.decocache.com/decocms/cd7ca472-0f72-463a-b0de-6e44bdd0f9b4/mcp.png", "unlisted": false, "metadata": { - "categories": "Developer Tools", + "categories": ["Developer Tools"], "official": false, "tags": ["mcp", "registry", "discovery", "marketplace", "integration", "catalog"], "short_description": "A registry translation server that normalizes third-party MCP registries into this system's format. When no external registry URL is supplied, the server automatically falls back to the official MCP store.", diff --git a/scripts/build-mcp.ts b/scripts/build-mcp.ts index bc8cbd36..c8b324d0 100644 --- a/scripts/build-mcp.ts +++ b/scripts/build-mcp.ts @@ -1,23 +1,23 @@ import { $ } from "bun"; const FOLDER_OVERRIDES = { - vibemcp: "mcp-studio", + vibemcp: "mcp-studio", }; const PKG_NAME_OVERRIDES = { - vibemcp: "mcp-studio", - openrouter: "@decocms/openrouter", + vibemcp: "mcp-studio", + openrouter: "@decocms/openrouter", }; const getMcpPkgName = (siteName: string) => { - return PKG_NAME_OVERRIDES[siteName] || siteName; + return PKG_NAME_OVERRIDES[siteName] || siteName; }; const siteName = process.env.DECO_SITE_NAME; if (!siteName) { - console.error("❌ Error: DECO_SITE_NAME environment variable is not set"); - process.exit(1); + console.error("❌ Error: DECO_SITE_NAME environment variable is not set"); + process.exit(1); } console.log(`Building MCP for site name ${siteName}`); @@ -25,10 +25,10 @@ console.log(`Building MCP for site name ${siteName}`); const pkgToBuild = getMcpPkgName(siteName); if (!pkgToBuild) { - console.error( - `❌ Error building MCP: package with name ${siteName} not found`, - ); - process.exit(1); + console.error( + `❌ Error building MCP: package with name ${siteName} not found`, + ); + process.exit(1); } await $`bun run --filter=${pkgToBuild} build`; diff --git a/vercel-official/app.json b/vercel-official/app.json index 76b74589..4728433e 100644 --- a/vercel-official/app.json +++ b/vercel-official/app.json @@ -10,7 +10,7 @@ "icon": "https://vercel.com/favicon.ico", "unlisted": false, "metadata": { - "categories": "Software Development", + "categories": ["Software Development"], "official": true, "mesh_unlisted": true, "tags": ["deployment", "frontend", "nextjs", "serverless", "vercel", "jamstack", "cdn", "edge-functions", "ci-cd"], diff --git a/wix-official/app.json b/wix-official/app.json index 0cae7b29..70df66b4 100644 --- a/wix-official/app.json +++ b/wix-official/app.json @@ -10,7 +10,7 @@ "icon": "https://www.wix.com/favicon.ico", "unlisted": false, "metadata": { - "categories": "CMS", + "categories": ["CMS"], "official": true, "mesh_unlisted": true, "tags": ["website-builder", "cms", "e-commerce", "no-code", "wix", "drag-and-drop", "templates", "blogging", "online-store"], From a00466d3a6fedd951735e2ea82978dcb662e11c6 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Fri, 9 Jan 2026 11:37:00 -0300 Subject: [PATCH 29/31] Fix JSON formatting in app.json --- google-tag-manager/app.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-tag-manager/app.json b/google-tag-manager/app.json index ff98c803..e9012d65 100644 --- a/google-tag-manager/app.json +++ b/google-tag-manager/app.json @@ -7,7 +7,7 @@ "url": "https://sites-google-tag-manager.decocache.com/mcp" }, "description": "Manage Google Tag Manager resources including accounts, containers, workspaces, tags, triggers and variables via API.", - "icon": "https://assets.decocache.com/decocms/9636f785-2d20-4b90-8fd8-6bd8-6bd8f0b29afb/google-tag-manager.jpg", + "icon": "https://assets.decocache.com/decocms/9636f785-2d20-4b90-8fd8-6bd8f0b29afb/google-tag-manager.jpg", "unlisted": false, "metadata": { "categories": ["Analytics"], From 18bac65a583faf826cba8e86a683ca8bde5faea0 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Fri, 9 Jan 2026 18:38:15 -0300 Subject: [PATCH 30/31] feat(google-ads): enhance Google Ads MCP with developer token support and metadata updates --- google-ads/app.json | 9 ++- google-ads/server/lib/google-ads-client.ts | 4 + google-ads/server/tools/accounts.ts | 16 +++- google-ads/server/tools/ad-groups.ts | 66 +++++++++++----- google-ads/server/tools/ads.ts | 55 ++++++++++---- google-ads/server/tools/campaigns.ts | 66 +++++++++++----- google-ads/server/tools/keywords.ts | 88 ++++++++++++++++------ google-ads/server/tools/reports.ts | 44 ++++++++--- google-ads/shared/deco.gen.ts | 24 +++++- 9 files changed, 276 insertions(+), 96 deletions(-) diff --git a/google-ads/app.json b/google-ads/app.json index d69c60a4..46438a07 100644 --- a/google-ads/app.json +++ b/google-ads/app.json @@ -8,6 +8,13 @@ }, "description": "Manage Google Ads campaigns, ad groups, ads, keywords, and get performance reports via API.", "icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Google_Ads_logo.svg/1200px-Google_Ads_logo.svg.png", - "unlisted": false + "unlisted": false, + "metadata": { + "categories": ["Advertising"], + "official": false, + "tags": ["google", "ads", "advertising", "ppc", "campaigns", "marketing", "sem"], + "short_description": "Manage Google Ads campaigns, ad groups, ads, keywords, and get performance reports via API.", + "mesh_description": "The Google Ads MCP provides comprehensive integration with Google Ads API, enabling programmatic management of advertising campaigns at scale. This MCP allows AI agents and automation systems to create, read, update, and manage Google Ads resources including campaigns, ad groups, ads, keywords, and bidding strategies. It supports complete campaign management workflows, from creating new campaigns with targeting settings to monitoring performance with detailed reporting. The integration enables automated campaign optimization, bulk ad operations, keyword research and management, budget allocation, and performance analytics. Perfect for marketing agencies, advertisers, and businesses who need to manage advertising at scale, automate campaign operations across multiple accounts, or integrate Google Ads management into their marketing automation workflows. Supports all major Google Ads resource types and enables advanced automation scenarios for campaign optimization, A/B testing, and ROI tracking." + } } diff --git a/google-ads/server/lib/google-ads-client.ts b/google-ads/server/lib/google-ads-client.ts index 04aac9f3..3286f579 100644 --- a/google-ads/server/lib/google-ads-client.ts +++ b/google-ads/server/lib/google-ads-client.ts @@ -38,6 +38,7 @@ import type { export interface GoogleAdsClientConfig { accessToken: string; + developerToken: string; } /** @@ -46,9 +47,11 @@ export interface GoogleAdsClientConfig { */ export class GoogleAdsClient { private accessToken: string; + private developerToken: string; constructor(config: GoogleAdsClientConfig) { this.accessToken = config.accessToken; + this.developerToken = config.developerToken; } /** @@ -59,6 +62,7 @@ export class GoogleAdsClient { ...options, headers: { Authorization: `Bearer ${this.accessToken}`, + "developer-token": this.developerToken, "Content-Type": "application/json", ...options.headers, }, diff --git a/google-ads/server/tools/accounts.ts b/google-ads/server/tools/accounts.ts index 4dc53aad..ebd52afd 100644 --- a/google-ads/server/tools/accounts.ts +++ b/google-ads/server/tools/accounts.ts @@ -30,10 +30,17 @@ export const createListAccessibleCustomersTool = (env: Env) => ), count: z.number().describe("Number of accessible customers"), }), - execute: async () => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + execute: async () => { + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; // Hardcoded for testing + + console.log("Using Developer Token:", developerToken); + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const response = await client.listAccessibleCustomers(); @@ -87,6 +94,7 @@ export const createGetCustomerTool = (env: Env) => execute: async ({ context }) => { const client = new GoogleAdsClient({ accessToken: getAccessToken(env), + developerToken: env.MESH_REQUEST_CONTEXT?.state?.developerToken || "", }); const customer = await client.getCustomer(context.customerId); diff --git a/google-ads/server/tools/ad-groups.ts b/google-ads/server/tools/ad-groups.ts index 1577aaa3..86ba38cf 100644 --- a/google-ads/server/tools/ad-groups.ts +++ b/google-ads/server/tools/ad-groups.ts @@ -43,9 +43,14 @@ export const createListAdGroupsTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const adGroups = await client.listAdGroups( context.customerId, @@ -98,9 +103,14 @@ export const createGetAdGroupTool = (env: Env) => .nullable(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const adGroup = await client.getAdGroup( context.customerId, @@ -182,9 +192,14 @@ export const createCreateAdGroupTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const response = await client.createAdGroup(context.customerId, { name: context.name, @@ -249,9 +264,14 @@ export const createUpdateAdGroupTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const response = await client.updateAdGroup(context.customerId, { resourceName: context.adGroupResourceName, @@ -294,9 +314,14 @@ export const createPauseAdGroupTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); await client.updateAdGroupStatus( context.customerId, @@ -335,9 +360,14 @@ export const createEnableAdGroupTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); await client.updateAdGroupStatus( context.customerId, diff --git a/google-ads/server/tools/ads.ts b/google-ads/server/tools/ads.ts index c3219039..72096387 100644 --- a/google-ads/server/tools/ads.ts +++ b/google-ads/server/tools/ads.ts @@ -44,9 +44,14 @@ export const createListAdsTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const ads = await client.listAds(context.customerId, context.adGroupId); @@ -106,9 +111,14 @@ export const createGetAdTool = (env: Env) => .nullable(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const adGroupAd = await client.getAd( context.customerId, @@ -187,9 +197,14 @@ export const createCreateResponsiveSearchAdTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const response = await client.createResponsiveSearchAd( context.customerId, @@ -239,9 +254,14 @@ export const createPauseAdTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); await client.updateAdStatus( context.customerId, @@ -279,9 +299,14 @@ export const createEnableAdTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); await client.updateAdStatus( context.customerId, diff --git a/google-ads/server/tools/campaigns.ts b/google-ads/server/tools/campaigns.ts index 96fff18b..e4802935 100644 --- a/google-ads/server/tools/campaigns.ts +++ b/google-ads/server/tools/campaigns.ts @@ -46,9 +46,14 @@ export const createListCampaignsTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const campaigns = await client.listCampaigns( context.customerId, @@ -113,9 +118,14 @@ export const createGetCampaignTool = (env: Env) => .nullable(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const campaign = await client.getCampaign( context.customerId, @@ -226,9 +236,14 @@ export const createCreateCampaignTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); // First, create the campaign budget const budgetResponse = await client.createCampaignBudget( @@ -328,9 +343,14 @@ export const createUpdateCampaignTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const networkSettings = context.targetGoogleSearch !== undefined || @@ -384,9 +404,14 @@ export const createPauseCampaignTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); await client.updateCampaignStatus( context.customerId, @@ -425,9 +450,14 @@ export const createEnableCampaignTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); await client.updateCampaignStatus( context.customerId, diff --git a/google-ads/server/tools/keywords.ts b/google-ads/server/tools/keywords.ts index 355d4b9b..ce834cd1 100644 --- a/google-ads/server/tools/keywords.ts +++ b/google-ads/server/tools/keywords.ts @@ -45,9 +45,14 @@ export const createListKeywordsTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const keywords = await client.listKeywords( context.customerId, @@ -105,9 +110,14 @@ export const createGetKeywordTool = (env: Env) => .nullable(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const keyword = await client.getKeyword( context.customerId, @@ -188,9 +198,14 @@ export const createCreateKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const response = await client.createKeyword(context.customerId, { adGroup: context.adGroupResourceName, @@ -250,9 +265,14 @@ export const createCreateNegativeKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const response = await client.createKeyword(context.customerId, { adGroup: context.adGroupResourceName, @@ -309,9 +329,14 @@ export const createUpdateKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const response = await client.updateKeyword(context.customerId, { resourceName: context.keywordResourceName, @@ -352,9 +377,14 @@ export const createPauseKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); await client.updateKeywordStatus( context.customerId, @@ -393,9 +423,14 @@ export const createEnableKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); await client.updateKeywordStatus( context.customerId, @@ -434,9 +469,14 @@ export const createRemoveKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); await client.removeKeyword( context.customerId, diff --git a/google-ads/server/tools/reports.ts b/google-ads/server/tools/reports.ts index 7b963c6f..da310276 100644 --- a/google-ads/server/tools/reports.ts +++ b/google-ads/server/tools/reports.ts @@ -68,9 +68,14 @@ export const createGetAccountPerformanceTool = (env: Env) => }), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const rows = await client.getAccountPerformance( context.customerId, @@ -160,9 +165,14 @@ export const createGetCampaignPerformanceTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const rows = await client.getCampaignPerformance( context.customerId, @@ -246,9 +256,14 @@ export const createGetAdGroupPerformanceTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const rows = await client.getAdGroupPerformance( context.customerId, @@ -334,9 +349,14 @@ export const createGetKeywordPerformanceTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - }); + const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN || + "NSC8PQesrKHxJCsygni2A"; + + const client = new GoogleAdsClient({ + accessToken: getAccessToken(env), + developerToken, + }); const rows = await client.getKeywordPerformance( context.customerId, diff --git a/google-ads/shared/deco.gen.ts b/google-ads/shared/deco.gen.ts index 95c291bb..de6575c8 100644 --- a/google-ads/shared/deco.gen.ts +++ b/google-ads/shared/deco.gen.ts @@ -2,6 +2,14 @@ import { z } from "zod"; +/** + * User state configuration + */ +export interface State { + /** Google Ads Developer Token */ + developerToken: string; +} + /** * Mesh request context injected by the Deco runtime * Contains authentication and metadata for the current request @@ -9,8 +17,8 @@ import { z } from "zod"; export interface MeshRequestContext { /** OAuth access token from Google */ authorization?: string; - /** Internal state for OAuth flow */ - state?: string; + /** User state configuration */ + state?: State; /** JWT token for the request */ token?: string; /** URL of the mesh server */ @@ -39,9 +47,17 @@ export interface Env { } /** - * State schema for OAuth flow validation + * State schema for OAuth flow validation and Google Ads API configuration */ -export const StateSchema = z.object({}); +export const StateSchema = z.object({ + /** + * Google Ads Developer Token + * Required for API access. Get it from: https://ads.google.com/aw/apicenter + */ + developerToken: z + .string() + .describe("Google Ads Developer Token (from API Center)"), +}); /** * MCP type helper for typed tool definitions From 29570406573c0ad8cf34faae6aba7e3ca3ac1b01 Mon Sep 17 00:00:00 2001 From: Jonas Jesus Date: Wed, 14 Jan 2026 12:29:44 -0300 Subject: [PATCH 31/31] refactor(google-ads): improve code quality, typing and security - Remove hardcoded developer token (security issue) - Extract repeated logic to createGoogleAdsClient() helper - Add custom error classes (GoogleAdsApiError, GoogleAdsAuthError, GoogleAdsConfigError) - Improve constants typing with derived types - Remove unused imports (CampaignBudget, DATE_RANGE_PRESETS) - Fix typing error in listCampaigns() - Add types for DateRangePreset and other constant values --- google-ads/server/constants.ts | 47 ++++++++++- google-ads/server/lib/env.ts | 39 ++++++++- google-ads/server/lib/google-ads-client.ts | 98 +++++++++++++--------- google-ads/server/lib/types.ts | 68 +++++++++++++++ google-ads/server/tools/accounts.ts | 22 +---- google-ads/server/tools/ad-groups.ts | 62 ++------------ google-ads/server/tools/ads.ts | 52 ++---------- google-ads/server/tools/campaigns.ts | 60 ++----------- google-ads/server/tools/keywords.ts | 82 ++---------------- google-ads/server/tools/reports.ts | 43 ++-------- 10 files changed, 246 insertions(+), 327 deletions(-) diff --git a/google-ads/server/constants.ts b/google-ads/server/constants.ts index 9fd70ef0..b8a764ee 100644 --- a/google-ads/server/constants.ts +++ b/google-ads/server/constants.ts @@ -5,12 +5,13 @@ /** * Google Ads API version */ -export const GOOGLE_ADS_API_VERSION = "v18"; +export const GOOGLE_ADS_API_VERSION = "v18" as const; /** * Google Ads API base URL */ -export const GOOGLE_ADS_API_BASE = `https://googleads.googleapis.com/${GOOGLE_ADS_API_VERSION}`; +export const GOOGLE_ADS_API_BASE = + `https://googleads.googleapis.com/${GOOGLE_ADS_API_VERSION}` as const; /** * API Endpoints for Google Ads @@ -89,7 +90,7 @@ export const ENDPOINTS = { /** * Default page size for queries */ -export const DEFAULT_PAGE_SIZE = 1000; +export const DEFAULT_PAGE_SIZE = 1000 as const; /** * Campaign status values @@ -100,6 +101,10 @@ export const CAMPAIGN_STATUS = { REMOVED: "REMOVED", } as const; +/** Type for campaign status values */ +export type CampaignStatusValue = + (typeof CAMPAIGN_STATUS)[keyof typeof CAMPAIGN_STATUS]; + /** * Ad group status values */ @@ -109,6 +114,10 @@ export const AD_GROUP_STATUS = { REMOVED: "REMOVED", } as const; +/** Type for ad group status values */ +export type AdGroupStatusValue = + (typeof AD_GROUP_STATUS)[keyof typeof AD_GROUP_STATUS]; + /** * Ad status values */ @@ -118,6 +127,9 @@ export const AD_STATUS = { REMOVED: "REMOVED", } as const; +/** Type for ad status values */ +export type AdStatusValue = (typeof AD_STATUS)[keyof typeof AD_STATUS]; + /** * Keyword match types */ @@ -127,6 +139,10 @@ export const KEYWORD_MATCH_TYPE = { BROAD: "BROAD", } as const; +/** Type for keyword match type values */ +export type KeywordMatchTypeValue = + (typeof KEYWORD_MATCH_TYPE)[keyof typeof KEYWORD_MATCH_TYPE]; + /** * Advertising channel types */ @@ -145,6 +161,10 @@ export const ADVERTISING_CHANNEL_TYPE = { DISCOVERY: "DISCOVERY", } as const; +/** Type for advertising channel type values */ +export type AdvertisingChannelTypeValue = + (typeof ADVERTISING_CHANNEL_TYPE)[keyof typeof ADVERTISING_CHANNEL_TYPE]; + /** * Bidding strategy types */ @@ -161,6 +181,10 @@ export const BIDDING_STRATEGY_TYPE = { ENHANCED_CPC: "ENHANCED_CPC", } as const; +/** Type for bidding strategy type values */ +export type BiddingStrategyTypeValue = + (typeof BIDDING_STRATEGY_TYPE)[keyof typeof BIDDING_STRATEGY_TYPE]; + /** * Budget delivery methods */ @@ -169,6 +193,10 @@ export const BUDGET_DELIVERY_METHOD = { ACCELERATED: "ACCELERATED", } as const; +/** Type for budget delivery method values */ +export type BudgetDeliveryMethodValue = + (typeof BUDGET_DELIVERY_METHOD)[keyof typeof BUDGET_DELIVERY_METHOD]; + /** * Ad group types */ @@ -181,6 +209,10 @@ export const AD_GROUP_TYPE = { VIDEO_RESPONSIVE: "VIDEO_RESPONSIVE", } as const; +/** Type for ad group type values */ +export type AdGroupTypeValue = + (typeof AD_GROUP_TYPE)[keyof typeof AD_GROUP_TYPE]; + /** * Common GAQL queries */ @@ -400,3 +432,12 @@ export const DATE_RANGE_PRESETS = { LAST_MONTH: "LAST_MONTH", ALL_TIME: "ALL_TIME", } as const; + +/** Type for date range preset values */ +export type DateRangePresetValue = + (typeof DATE_RANGE_PRESETS)[keyof typeof DATE_RANGE_PRESETS]; + +/** Array of all valid date range preset keys for use in Zod schemas */ +export const DATE_RANGE_PRESET_VALUES = Object.values( + DATE_RANGE_PRESETS, +) as DateRangePresetValue[]; diff --git a/google-ads/server/lib/env.ts b/google-ads/server/lib/env.ts index ae143ab9..59d68762 100644 --- a/google-ads/server/lib/env.ts +++ b/google-ads/server/lib/env.ts @@ -1,17 +1,52 @@ import type { Env } from "../../shared/deco.gen.ts"; +import { GoogleAdsClient } from "./google-ads-client.ts"; +import { GoogleAdsAuthError, GoogleAdsConfigError } from "./types.ts"; /** * Get Google OAuth access token from environment context * @param env - The environment containing the mesh request context * @returns The OAuth access token - * @throws Error if not authenticated + * @throws GoogleAdsAuthError if not authenticated */ export const getGoogleAccessToken = (env: Env): string => { const authorization = env.MESH_REQUEST_CONTEXT?.authorization; if (!authorization) { - throw new Error( + throw new GoogleAdsAuthError( "Not authenticated. Please authorize with Google Ads first.", ); } return authorization; }; + +/** + * Get Google Ads Developer Token from environment context or process env + * @param env - The environment containing the mesh request context + * @returns The developer token + * @throws GoogleAdsConfigError if developer token is not configured + */ +export const getDeveloperToken = (env: Env): string => { + const developerToken = + env.MESH_REQUEST_CONTEXT?.state?.developerToken || + process.env.GOOGLE_ADS_DEVELOPER_TOKEN; + + if (!developerToken) { + throw new GoogleAdsConfigError( + "Developer token not configured. Please set the developerToken in state or GOOGLE_ADS_DEVELOPER_TOKEN environment variable.", + ); + } + return developerToken; +}; + +/** + * Create a configured GoogleAdsClient instance + * @param env - The environment containing auth and configuration + * @returns A configured GoogleAdsClient instance + * @throws GoogleAdsAuthError if not authenticated + * @throws GoogleAdsConfigError if developer token is not configured + */ +export const createGoogleAdsClient = (env: Env): GoogleAdsClient => { + return new GoogleAdsClient({ + accessToken: getGoogleAccessToken(env), + developerToken: getDeveloperToken(env), + }); +}; diff --git a/google-ads/server/lib/google-ads-client.ts b/google-ads/server/lib/google-ads-client.ts index 3286f579..65b2cbad 100644 --- a/google-ads/server/lib/google-ads-client.ts +++ b/google-ads/server/lib/google-ads-client.ts @@ -4,36 +4,37 @@ */ import { ENDPOINTS, DEFAULT_PAGE_SIZE, GAQL_QUERIES } from "../constants.ts"; -import type { - Customer, - Campaign, - CampaignBudget, - AdGroup, - AdGroupAd, - AdGroupCriterion, - ListAccessibleCustomersResponse, - SearchGoogleAdsResponse, - SearchGoogleAdsStreamResponse, - GoogleAdsRow, - MutateCampaignsResponse, - MutateCampaignBudgetsResponse, - MutateAdGroupsResponse, - MutateAdGroupAdsResponse, - MutateAdGroupCriteriaResponse, - CreateCampaignInput, - UpdateCampaignInput, - CreateCampaignBudgetInput, - CreateAdGroupInput, - UpdateAdGroupInput, - CreateResponsiveSearchAdInput, - UpdateAdGroupAdInput, - CreateKeywordInput, - UpdateKeywordInput, - ApiErrorResponse, - CampaignStatus, - AdGroupStatus, - AdGroupAdStatus, - AdGroupCriterionStatus, +import { + GoogleAdsApiError, + type Customer, + type Campaign, + type AdGroup, + type AdGroupAd, + type AdGroupCriterion, + type ListAccessibleCustomersResponse, + type SearchGoogleAdsResponse, + type SearchGoogleAdsStreamResponse, + type GoogleAdsRow, + type MutateCampaignsResponse, + type MutateCampaignBudgetsResponse, + type MutateAdGroupsResponse, + type MutateAdGroupAdsResponse, + type MutateAdGroupCriteriaResponse, + type CreateCampaignInput, + type UpdateCampaignInput, + type CreateCampaignBudgetInput, + type CreateAdGroupInput, + type UpdateAdGroupInput, + type CreateResponsiveSearchAdInput, + type UpdateAdGroupAdInput, + type CreateKeywordInput, + type UpdateKeywordInput, + type ApiErrorResponse, + type GoogleAdsError, + type CampaignStatus, + type AdGroupStatus, + type AdGroupAdStatus, + type AdGroupCriterionStatus, } from "./types.ts"; export interface GoogleAdsClientConfig { @@ -56,6 +57,7 @@ export class GoogleAdsClient { /** * Make a request to the Google Ads API + * @throws GoogleAdsApiError on API errors with details */ private async request(url: string, options: RequestInit = {}): Promise { const response = await fetch(url, { @@ -71,15 +73,31 @@ export class GoogleAdsClient { if (!response.ok) { const errorText = await response.text(); let errorMessage = `Google Ads API error: ${response.status}`; + let errorDetails: GoogleAdsError | undefined; try { const errorData = JSON.parse(errorText) as ApiErrorResponse; errorMessage = errorData.error?.message || errorMessage; + + // Extract detailed error information if available + if (errorData.error?.details) { + const googleAdsDetails = errorData.error.details.find( + (d) => d["@type"]?.includes("GoogleAdsFailure") && d.errors, + ); + if (googleAdsDetails?.errors) { + errorDetails = { errors: googleAdsDetails.errors }; + } + } } catch { errorMessage = `${errorMessage} - ${errorText}`; } - throw new Error(errorMessage); + throw new GoogleAdsApiError( + errorMessage, + response.status, + response.statusText, + errorDetails, + ); } // Handle 204 No Content @@ -196,10 +214,8 @@ export class GoogleAdsClient { customerId: string, statusFilter?: CampaignStatus, ): Promise { - let query = GAQL_QUERIES.LIST_CAMPAIGNS; - - if (statusFilter) { - query = ` + const query = statusFilter + ? ` SELECT campaign.id, campaign.name, @@ -214,8 +230,8 @@ export class GoogleAdsClient { FROM campaign WHERE campaign.status = '${statusFilter}' ORDER BY campaign.name - `; - } + ` + : GAQL_QUERIES.LIST_CAMPAIGNS; const response = await this.searchStream(customerId, query); return response.results @@ -1015,5 +1031,9 @@ export class GoogleAdsClient { } } -// Re-export getGoogleAccessToken from env.ts for convenience -export { getGoogleAccessToken as getAccessToken } from "./env.ts"; +// Re-export helpers from env.ts for convenience +export { + getGoogleAccessToken as getAccessToken, + getDeveloperToken, + createGoogleAdsClient, +} from "./env.ts"; diff --git a/google-ads/server/lib/types.ts b/google-ads/server/lib/types.ts index ede05be6..fb7beeef 100644 --- a/google-ads/server/lib/types.ts +++ b/google-ads/server/lib/types.ts @@ -3,6 +3,28 @@ * Based on Google Ads API v18 specification */ +// ============================================================================ +// Date Range Type +// ============================================================================ + +/** + * Date range presets for reports + */ +export type DateRangePreset = + | "TODAY" + | "YESTERDAY" + | "LAST_7_DAYS" + | "LAST_14_DAYS" + | "LAST_30_DAYS" + | "LAST_90_DAYS" + | "THIS_WEEK_SUN_TODAY" + | "THIS_WEEK_MON_TODAY" + | "LAST_WEEK_SUN_SAT" + | "LAST_WEEK_MON_SUN" + | "THIS_MONTH" + | "LAST_MONTH" + | "ALL_TIME"; + // ============================================================================ // Enums and Status Types // ============================================================================ @@ -904,3 +926,49 @@ export interface ApiErrorResponse { }>; }; } + +// ============================================================================ +// Custom Error Classes +// ============================================================================ + +/** + * Base error for Google Ads API errors + */ +export class GoogleAdsApiError extends Error { + public readonly code: number; + public readonly status: string; + public readonly details?: GoogleAdsError; + + constructor( + message: string, + code: number, + status: string, + details?: GoogleAdsError, + ) { + super(message); + this.name = "GoogleAdsApiError"; + this.code = code; + this.status = status; + this.details = details; + } +} + +/** + * Error for authentication issues + */ +export class GoogleAdsAuthError extends Error { + constructor(message: string) { + super(message); + this.name = "GoogleAdsAuthError"; + } +} + +/** + * Error for configuration issues + */ +export class GoogleAdsConfigError extends Error { + constructor(message: string) { + super(message); + this.name = "GoogleAdsConfigError"; + } +} diff --git a/google-ads/server/tools/accounts.ts b/google-ads/server/tools/accounts.ts index ebd52afd..06efcea9 100644 --- a/google-ads/server/tools/accounts.ts +++ b/google-ads/server/tools/accounts.ts @@ -7,7 +7,7 @@ import { createPrivateTool } from "@decocms/runtime/tools"; import { z } from "zod"; import type { Env } from "../main.ts"; -import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; // ============================================================================ // List Accessible Customers Tool @@ -30,18 +30,8 @@ export const createListAccessibleCustomersTool = (env: Env) => ), count: z.number().describe("Number of accessible customers"), }), - execute: async () => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; // Hardcoded for testing - - console.log("Using Developer Token:", developerToken); - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + execute: async () => { + const client = createGoogleAdsClient(env); const response = await client.listAccessibleCustomers(); const customers = (response.resourceNames || []).map((resourceName) => { @@ -92,11 +82,7 @@ export const createGetCustomerTool = (env: Env) => .nullable(), }), execute: async ({ context }) => { - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken: env.MESH_REQUEST_CONTEXT?.state?.developerToken || "", - }); - + const client = createGoogleAdsClient(env); const customer = await client.getCustomer(context.customerId); if (!customer) { diff --git a/google-ads/server/tools/ad-groups.ts b/google-ads/server/tools/ad-groups.ts index 86ba38cf..306363de 100644 --- a/google-ads/server/tools/ad-groups.ts +++ b/google-ads/server/tools/ad-groups.ts @@ -7,7 +7,7 @@ import { createPrivateTool } from "@decocms/runtime/tools"; import { z } from "zod"; import type { Env } from "../main.ts"; -import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; import type { AdGroupStatus, AdGroupType } from "../lib/types.ts"; // ============================================================================ @@ -43,15 +43,7 @@ export const createListAdGroupsTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const adGroups = await client.listAdGroups( context.customerId, context.campaignId, @@ -103,15 +95,7 @@ export const createGetAdGroupTool = (env: Env) => .nullable(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const adGroup = await client.getAdGroup( context.customerId, context.adGroupId, @@ -192,15 +176,7 @@ export const createCreateAdGroupTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const response = await client.createAdGroup(context.customerId, { name: context.name, campaign: context.campaignResourceName, @@ -264,15 +240,7 @@ export const createUpdateAdGroupTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const response = await client.updateAdGroup(context.customerId, { resourceName: context.adGroupResourceName, name: context.name, @@ -314,15 +282,7 @@ export const createPauseAdGroupTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); await client.updateAdGroupStatus( context.customerId, context.adGroupResourceName, @@ -360,15 +320,7 @@ export const createEnableAdGroupTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); await client.updateAdGroupStatus( context.customerId, context.adGroupResourceName, diff --git a/google-ads/server/tools/ads.ts b/google-ads/server/tools/ads.ts index 72096387..9e28cdfe 100644 --- a/google-ads/server/tools/ads.ts +++ b/google-ads/server/tools/ads.ts @@ -7,7 +7,7 @@ import { createPrivateTool } from "@decocms/runtime/tools"; import { z } from "zod"; import type { Env } from "../main.ts"; -import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; import type { AdGroupAdStatus } from "../lib/types.ts"; // ============================================================================ @@ -44,15 +44,7 @@ export const createListAdsTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const ads = await client.listAds(context.customerId, context.adGroupId); return { @@ -111,15 +103,7 @@ export const createGetAdTool = (env: Env) => .nullable(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const adGroupAd = await client.getAd( context.customerId, context.adGroupId, @@ -197,15 +181,7 @@ export const createCreateResponsiveSearchAdTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const response = await client.createResponsiveSearchAd( context.customerId, { @@ -254,15 +230,7 @@ export const createPauseAdTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); await client.updateAdStatus( context.customerId, context.adResourceName, @@ -299,15 +267,7 @@ export const createEnableAdTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); await client.updateAdStatus( context.customerId, context.adResourceName, diff --git a/google-ads/server/tools/campaigns.ts b/google-ads/server/tools/campaigns.ts index e4802935..eb80aeea 100644 --- a/google-ads/server/tools/campaigns.ts +++ b/google-ads/server/tools/campaigns.ts @@ -7,7 +7,7 @@ import { createPrivateTool } from "@decocms/runtime/tools"; import { z } from "zod"; import type { Env } from "../main.ts"; -import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; import type { CampaignStatus, AdvertisingChannelType } from "../lib/types.ts"; // ============================================================================ @@ -46,15 +46,7 @@ export const createListCampaignsTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const campaigns = await client.listCampaigns( context.customerId, context.statusFilter as CampaignStatus | undefined, @@ -118,15 +110,7 @@ export const createGetCampaignTool = (env: Env) => .nullable(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const campaign = await client.getCampaign( context.customerId, context.campaignId, @@ -236,14 +220,7 @@ export const createCreateCampaignTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); + const client = createGoogleAdsClient(env); // First, create the campaign budget const budgetResponse = await client.createCampaignBudget( @@ -343,14 +320,7 @@ export const createUpdateCampaignTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); + const client = createGoogleAdsClient(env); const networkSettings = context.targetGoogleSearch !== undefined || @@ -404,15 +374,7 @@ export const createPauseCampaignTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); await client.updateCampaignStatus( context.customerId, context.campaignResourceName, @@ -450,15 +412,7 @@ export const createEnableCampaignTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); await client.updateCampaignStatus( context.customerId, context.campaignResourceName, diff --git a/google-ads/server/tools/keywords.ts b/google-ads/server/tools/keywords.ts index ce834cd1..480fbd56 100644 --- a/google-ads/server/tools/keywords.ts +++ b/google-ads/server/tools/keywords.ts @@ -7,7 +7,7 @@ import { createPrivateTool } from "@decocms/runtime/tools"; import { z } from "zod"; import type { Env } from "../main.ts"; -import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; import type { KeywordMatchType, AdGroupCriterionStatus } from "../lib/types.ts"; // ============================================================================ @@ -45,15 +45,7 @@ export const createListKeywordsTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const keywords = await client.listKeywords( context.customerId, context.adGroupId, @@ -110,15 +102,7 @@ export const createGetKeywordTool = (env: Env) => .nullable(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const keyword = await client.getKeyword( context.customerId, context.adGroupId, @@ -198,15 +182,7 @@ export const createCreateKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const response = await client.createKeyword(context.customerId, { adGroup: context.adGroupResourceName, status: (context.status || "ENABLED") as AdGroupCriterionStatus, @@ -265,15 +241,7 @@ export const createCreateNegativeKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const response = await client.createKeyword(context.customerId, { adGroup: context.adGroupResourceName, status: "ENABLED", @@ -329,15 +297,7 @@ export const createUpdateKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const response = await client.updateKeyword(context.customerId, { resourceName: context.keywordResourceName, status: context.status as AdGroupCriterionStatus | undefined, @@ -377,15 +337,7 @@ export const createPauseKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); await client.updateKeywordStatus( context.customerId, context.keywordResourceName, @@ -423,15 +375,7 @@ export const createEnableKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); await client.updateKeywordStatus( context.customerId, context.keywordResourceName, @@ -469,15 +413,7 @@ export const createRemoveKeywordTool = (env: Env) => success: z.boolean(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); await client.removeKeyword( context.customerId, context.keywordResourceName, diff --git a/google-ads/server/tools/reports.ts b/google-ads/server/tools/reports.ts index da310276..c7a9ac63 100644 --- a/google-ads/server/tools/reports.ts +++ b/google-ads/server/tools/reports.ts @@ -7,8 +7,7 @@ import { createPrivateTool } from "@decocms/runtime/tools"; import { z } from "zod"; import type { Env } from "../main.ts"; -import { GoogleAdsClient, getAccessToken } from "../lib/google-ads-client.ts"; -import { DATE_RANGE_PRESETS } from "../constants.ts"; +import { createGoogleAdsClient } from "../lib/google-ads-client.ts"; // Helper to convert micros to currency string const microsToAmount = (micros: string | undefined): string | undefined => { @@ -68,15 +67,7 @@ export const createGetAccountPerformanceTool = (env: Env) => }), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const rows = await client.getAccountPerformance( context.customerId, context.dateRange, @@ -165,15 +156,7 @@ export const createGetCampaignPerformanceTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const rows = await client.getCampaignPerformance( context.customerId, context.dateRange, @@ -256,15 +239,7 @@ export const createGetAdGroupPerformanceTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const rows = await client.getAdGroupPerformance( context.customerId, context.dateRange, @@ -349,15 +324,7 @@ export const createGetKeywordPerformanceTool = (env: Env) => count: z.number(), }), execute: async ({ context }) => { - const developerToken = env.MESH_REQUEST_CONTEXT?.state?.developerToken || - process.env.GOOGLE_ADS_DEVELOPER_TOKEN || - "NSC8PQesrKHxJCsygni2A"; - - const client = new GoogleAdsClient({ - accessToken: getAccessToken(env), - developerToken, - }); - + const client = createGoogleAdsClient(env); const rows = await client.getKeywordPerformance( context.customerId, context.dateRange,