GO AI Tools
Qué hace este MCP
Provides utilities for image and video conversion, app-store assets, localization checks, color calculations, CSS, provisioning profiles, and related developer workflows.
Herramientas
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['appIdOrUrl'], 'properties': {'appIdOrUrl': {'type': 'string', 'maxLength': 2048, 'minLength': 1, 'description': 'Numeric App Store id (e.g. "6742322421") or a full apps.apple.com URL containing one.'}, 'storefronts': {'type': 'array', 'items': {'type': 'string', 'maxLength': 16}, 'maxItems': 120, 'description': 'Up to 30 2-letter storefront codes (e.g. ["US","GB","JP"]) after de-duplication. Omit to use the same 30 major markets the source tool defaults to.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['appId', 'checked', 'found', 'failed', 'distinctTitles', 'rows'], 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'required': ['country', 'countryName', 'available'], 'properties': {'error': {'type': 'string', 'description': 'Why this storefront could not be checked. Present only on a failed lookup, which also reports available:false.'}, 'price': {'type': ['string', 'null'], 'description': 'Formatted local price; present only when available.'}, 'title': {'type': ['string', 'null'], 'description': 'App name on this storefront; present only when available.'}, 'rating': {'type': ['number', 'null'], 'description': 'Average rating on this storefront; present only when available.'}, 'country': {'type': 'string', 'description': 'Storefront code.'}, 'currency': {'type': ['string', 'null'], 'description': 'ISO currency code; present only when available.'}, 'available': {'type': 'boolean', 'description': 'Whether the app is listed on this storefront. When false, the listing fields below are absent.'}, 'storeLink': {'type': ['string', 'null'], 'description': 'Local listing URL; present only when available.'}, 'countryName': {'type': 'string', 'description': 'Storefront name.'}, 'ratingCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Rating count on this storefront; present only when available.'}}, 'additionalProperties': False}, 'description': 'One row per requested storefront, in the order given. A row is one of three shapes: listed, not listed, or errored.'}, 'appId': {'type': 'string', 'description': 'The app ID that was looked up, extracted from the input if a URL was given.'}, 'found': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many of them have the app listed.'}, 'failed': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many lookups errored rather than returning a verdict.'}, 'checked': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many storefronts were queried.'}, 'distinctTitles': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Number of different titles seen across the storefronts that resolved -- more than one means the listing is localized.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['term'], 'properties': {'term': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "Search phrase, up to 200 characters. Sent verbatim to Apple's Search API as the query term."}, 'entity': {'enum': ['software', 'iPadSoftware', 'macSoftware'], 'type': 'string', 'default': 'software', 'description': 'App type: "software" (iPhone), "iPadSoftware" (iPad), or "macSoftware" (Mac).'}, 'country': {'type': 'string', 'maxLength': 2, 'minLength': 2, 'description': '2-letter App Store storefront code, e.g. "US", "GB", "JP". Defaults to "US".'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['term', 'country', 'entity', 'resultCount', 'capped', 'apps'], 'properties': {'apps': {'type': 'array', 'items': {'type': 'object', 'required': ['appId', 'title', 'seller', 'price', 'currency', 'rating', 'ratingCount', 'storeLink', 'artworkUrl'], 'properties': {'appId': {'type': ['string', 'null'], 'description': 'Numeric App Store app ID as a string, or null if Apple omitted it.'}, 'price': {'type': ['string', 'null'], 'description': 'Formatted price as Apple returns it, including the currency symbol.'}, 'title': {'type': ['string', 'null'], 'description': 'App name on this storefront.'}, 'rating': {'type': ['number', 'null'], 'description': 'Average user rating, or null when the app has none on this storefront.'}, 'seller': {'type': ['string', 'null'], 'description': 'Publisher name.'}, 'currency': {'type': ['string', 'null'], 'description': 'ISO currency code for that price.'}, 'storeLink': {'type': ['string', 'null'], 'description': 'Canonical apps.apple.com URL for the listing.'}, 'artworkUrl': {'type': ['string', 'null'], 'description': '100px artwork URL.'}, 'ratingCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Number of ratings; 0 when Apple reports none.'}}, 'additionalProperties': False}, 'description': 'The matching apps. Every field is nullable because Apple omits fields per storefront rather than returning empty values.'}, 'term': {'type': 'string', 'description': 'The search term, echoed back.'}, 'capped': {'type': 'boolean', 'description': "True when the result hit the Search API's 200-per-request ceiling, meaning there are likely more matches than were returned."}, 'entity': {'type': 'string', 'description': 'Which catalogue was searched (iPhone, iPad or Mac software).'}, 'country': {'type': 'string', 'description': 'The storefront that was searched.'}, 'resultCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': "Apple's own reported match count for the query."}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'bpm': {'type': 'number', 'description': 'Tempo in beats per minute, used directly and unrounded. Provide exactly one of bpm, tapTimesMs, or tapIntervalsMs.', 'exclusiveMinimum': 0}, 'bars': {'type': 'number', 'description': 'Number of bars to convert to seconds. At most one of bars/seconds is used if both are given (bars takes priority).', 'exclusiveMinimum': 0}, 'seconds': {'type': 'number', 'description': 'Number of seconds to convert to bars. Ignored if bars is also given.', 'exclusiveMinimum': 0}, 'divisions': {'type': 'array', 'items': {'type': 'integer', 'maximum': 9007199254740991, 'exclusiveMinimum': 0}, 'maxItems': 64, 'minItems': 1, 'description': 'Note divisions (denominator of 1/d) to include in the delay table, up to 64. Defaults to [1,2,4,8,16,32].'}, 'tapTimesMs': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 4096, 'minItems': 2, 'description': 'Strictly increasing millisecond timestamps of taps (e.g. from a high-resolution clock), in tap order, up to 4096. Provide exactly one of bpm, tapTimesMs, or tapIntervalsMs.'}, 'timeSignature': {'anyOf': [{'enum': ['4/4', '3/4', '2/4', '6/8', '5/4', '7/8', '12/8'], 'type': 'string'}, {'type': 'object', 'required': ['beats', 'unit'], 'properties': {'unit': {'type': 'integer', 'maximum': 9007199254740991, 'exclusiveMinimum': 0}, 'beats': {'type': 'integer', 'maximum': 9007199254740991, 'exclusiveMinimum': 0}}}], 'description': 'One of "4/4","3/4","2/4","6/8","5/4","7/8","12/8" (the site\'s presets), or a custom {beats, unit} pair. Defaults to 4/4. Uses the written beat count â\x80\x94 6/8 is 6 beats of an eighth-note unit, not 2 dotted-quarter beats.'}, 'tapIntervalsMs': {'type': 'array', 'items': {'type': 'number', 'exclusiveMinimum': 0}, 'maxItems': 4096, 'minItems': 1, 'description': 'Milliseconds between each tap and the one before it (one fewer entry than the number of taps), up to 4096. Provide exactly one of bpm, tapTimesMs, or tapIntervalsMs.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['bpm', 'bpmSource', 'timeSignature', 'barDurationSeconds', 'delayTable'], 'properties': {'bpm': {'type': 'number', 'description': 'The tempo the table was computed at, in beats per minute.'}, 'bars': {'type': 'number', 'description': 'The bar count that seconds corresponds to. Present only when bars or seconds was supplied.'}, 'seconds': {'type': 'number', 'description': 'Duration in seconds of that many bars at this tempo. Present only when bars or seconds was supplied.'}, 'bpmSource': {'type': 'string', 'description': "Where that tempo came from: given directly, or averaged from tap times or tap intervals -- worth surfacing, since a tapped tempo carries the tapper's error."}, 'delayTable': {'type': 'array', 'items': {'type': 'object', 'required': ['division', 'label', 'straightMs', 'dottedMs', 'tripletMs', 'hz'], 'properties': {'hz': {'type': 'number', 'description': 'The same interval expressed as a frequency, for setting an LFO rate rather than a delay.'}, 'label': {'type': 'string', 'description': 'That division written out.'}, 'division': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'The note division, as its denominator (4 = quarter note, 8 = eighth, and so on).'}, 'dottedMs': {'type': 'number', 'description': 'Dotted variant: 1.5x the straight time.'}, 'tripletMs': {'type': 'number', 'description': 'Triplet variant: two thirds of the straight time.'}, 'straightMs': {'type': 'number', 'description': 'Delay time in milliseconds for the straight note.'}}, 'additionalProperties': False}, 'description': 'One row per requested division, each with straight, dotted and triplet timings.'}, 'timeSignature': {'type': 'object', 'required': ['beats', 'unit', 'label'], 'properties': {'unit': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Note value that gets the beat (the denominator).'}, 'beats': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Beats per bar (the numerator).'}, 'label': {'type': 'string', 'description': "The signature written out, e.g. '4/4'."}}, 'description': 'The time signature used to size a bar.', 'additionalProperties': False}, 'barDurationSeconds': {'type': 'number', 'description': 'Length of one bar in seconds at this tempo and signature.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['items'], 'properties': {'items': {'type': 'array', 'items': {'enum': ['firebaseAnalytics', 'crashlytics', 'sentry', 'amplitude', 'admob', 'metaSdk', 'attribution', 'push', 'accounts', 'signInApple', 'iap', 'revenuecat', 'support', 'userPhotos', 'preciseLocation', 'healthKit', 'contactsAccess', 'search'], 'type': 'string'}, 'maxItems': 18, 'minItems': 1, 'description': 'SDKs/features present in the app binary. One or more of: firebaseAnalytics, crashlytics, sentry, amplitude, admob, metaSdk, attribution, push, accounts, signInApple, iap, revenuecat, support, userPhotos, preciseLocation, healthKit, contactsAccess, search. Repeats are ignored.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['trackingRequired', 'dataTypeCount', 'sdkCount', 'trackingNote', 'vendorDocumentationAsOf', 'disclaimer', 'groups', 'checklistText'], 'properties': {'groups': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'label', 'dataTypes'], 'properties': {'id': {'type': 'string', 'description': 'Stable identifier for the App Store Connect group.'}, 'label': {'type': 'string', 'description': "The group name as Apple presents it, e.g. 'Identifiers', 'Usage Data'."}, 'dataTypes': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'label', 'causedBy'], 'properties': {'id': {'type': 'string', 'description': 'Stable identifier for the data type.'}, 'label': {'type': 'string', 'description': 'The data type as Apple names it.'}, 'causedBy': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Which of the chosen items pulled this data type in -- the audit trail for the entry.'}}, 'additionalProperties': False}, 'description': 'The data types to declare under this group.'}}, 'additionalProperties': False}, 'description': 'Data types to declare, grouped the way App Store Connect groups them.'}, 'sdkCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many distinct SDKs/features were considered, after repeats collapse.'}, 'disclaimer': {'type': 'string', 'description': 'Standing note that this is a deterministic lookup, not a code scan and not compliance advice.'}, 'trackingNote': {'type': 'string', 'description': 'Explanation of the tracking verdict and what it obliges.'}, 'checklistText': {'type': 'string', 'description': 'The whole result as pasteable plain text, for dropping into a ticket or a submission checklist.'}, 'dataTypeCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Total number of distinct data types to declare across all groups.'}, 'trackingRequired': {'type': 'boolean', 'description': 'True when at least one chosen item implies App Tracking Transparency / the "Used to Track You" declaration.'}, 'vendorDocumentationAsOf': {'type': 'string', 'description': 'The date this mapping table was last checked against vendor documentation -- SDKs change what they collect, so this bounds how much to trust the answer.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['appIdOrUrl', 'store'], 'properties': {'ct': {'type': 'string', 'maxLength': 256, 'description': 'Campaign token (ct) for App Store Connect campaign attribution, up to 256 characters. Trimmed; omitted from the URL entirely if empty after trimming.'}, 'mt': {'type': 'boolean', 'default': True, 'description': "Append mt=8 (media type: software), marking the link as pointing at an app. Defaults to true, matching the source page's checkbox (checked by default)."}, 'pt': {'type': 'string', 'maxLength': 256, 'description': 'Provider token (pt) for App Store Connect campaign attribution, up to 256 characters. Trimmed; omitted from the URL entirely if empty after trimming.'}, 'store': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': '2-letter App Store storefront code (e.g. "us", "gb", "jp"). Decides which country\'s listing, price, and availability the link opens.'}, 'includeQr': {'type': 'boolean', 'default': False, 'description': 'Also render the URL as a QR code PNG and return it as image bytes. Defaults to false (URL + params only).'}, 'appIdOrUrl': {'type': 'string', 'maxLength': 2048, 'minLength': 1, 'description': 'Numeric App Store app ID (e.g. "6478912345"), or a full pasted App Store URL containing one (e.g. "https://apps.apple.com/us/app/x/id6478912345"). The id is extracted from anywhere in a URL; a bare value must be 4+ digits with nothing else, and at most 24 digits either way.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['url', 'appId', 'store', 'params'], 'properties': {'qr': {'type': 'object', 'required': ['version', 'moduleSize', 'errorCorrection', 'urlByteLength', 'pixelSize', 'scale'], 'properties': {'scale': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Pixels per module.'}, 'version': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'QR symbol version (1-10) the encoder settled on.'}, 'pixelSize': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Rendered PNG size in px.'}, 'moduleSize': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Symbol size in modules per side.'}, 'urlByteLength': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'UTF-8 byte length of the encoded URL; the version 10 ceiling is 213.'}, 'errorCorrection': {'type': 'string', 'description': 'Error-correction level used.'}}, 'description': 'Details of the rendered QR code. Present only when includeQr was true -- the PNG itself comes back as a separate content block.', 'additionalProperties': False}, 'url': {'type': 'string', 'description': 'The assembled apps.apple.com URL -- the answer most callers want.'}, 'appId': {'type': 'string', 'description': 'The numeric app ID, whether given directly or extracted from a pasted URL.'}, 'store': {'type': 'string', 'description': 'The two-letter storefront code the URL targets.'}, 'params': {'type': 'array', 'items': {'type': 'object', 'required': ['param', 'value', 'meaning'], 'properties': {'param': {'type': 'string', 'description': 'Query parameter name.'}, 'value': {'type': 'string', 'description': 'Its value in the assembled URL.'}, 'meaning': {'type': 'string', 'description': 'What that parameter does, since App Store Connect campaign parameters are not self-explanatory.'}}, 'additionalProperties': False}, 'description': 'Every query parameter in the URL, explained.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['price'], 'properties': {'price': {'type': 'number', 'maximum': 1000000, 'description': 'The customer-facing sticker price for this storefront (already tax-inclusive everywhere except the US).', 'exclusiveMinimum': 0}, 'countryCode': {'enum': ['us', 'gb', 'de', 'fr', 'it', 'es', 'nl', 'ie', 'at', 'be', 'pt', 'gr', 'fi', 'se', 'dk', 'no', 'pl', 'ch', 'tr', 'jp', 'kr', 'au', 'nz', 'sg', 'id', 'cn', 'in', 'ca', 'br', 'mx', 'ae', 'sa', 'za'], 'type': 'string', 'default': 'gb', 'description': 'Two-letter App Store storefront code (e.g. us, gb, de, jp, in). Selects the default tax rate and currency symbol. Defaults to gb, matching the tool page.'}, 'taxRatePercent': {'type': 'number', 'maximum': 99, 'minimum': 0, 'description': "Override the storefront's default tax rate baked into the price, as a percent (e.g. 20 for 20% VAT). Defaults to the selected countryCode's standard rate (0 for the US). Some storefronts' real rates vary by province, state or category -- see the warnings array."}, 'commissionScenario': {'enum': ['standard30', 'small15', 'yearTwo15'], 'type': 'string', 'default': 'standard30', 'description': "Which Apple commission rate applies to the tax-exclusive remainder: 'standard30' (30%, the default for most apps), 'small15' (15%, Apple's Small Business Program for developers under the program's proceeds threshold), or 'yearTwo15' (15%, the reduced rate a subscription bills at after a subscriber has accumulated one year of paid, unlapsed service). All three are always returned side by side in the comparison array regardless of which is selected here."}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['input', 'breakdown', 'appleShareOfStickerPercent', 'comparison', 'naiveComparison', 'warnings'], 'properties': {'input': {'type': 'object', 'required': ['price', 'countryCode', 'countryName', 'currencySymbol', 'taxRatePercent', 'commissionScenario'], 'properties': {'price': {'type': 'number', 'description': 'The customer-facing sticker price, echoed back.'}, 'countryCode': {'type': 'string', 'description': 'Two-letter storefront code used.'}, 'countryName': {'type': 'string', 'description': "That storefront's full name."}, 'currencySymbol': {'type': 'string', 'description': 'Currency symbol for the storefront -- every money figure below is in this currency.'}, 'taxRatePercent': {'type': 'number', 'description': 'The tax rate actually applied, whether supplied or taken from the storefront default.'}, 'commissionScenario': {'type': 'string', 'description': 'Which commission rate was applied.'}}, 'description': 'What the calculation actually ran on, including the defaults that were filled in.', 'additionalProperties': False}, 'warnings': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Cautions about the storefront, chiefly that its real tax rate varies by province, state or category. Empty when the rate is a single fixed number.'}, 'breakdown': {'type': 'object', 'required': ['customerPays', 'taxInsidePrice', 'commissionBase', 'appleCommission', 'paidToYou'], 'properties': {'paidToYou': {'type': 'number', 'description': 'What the developer receives per sale.'}, 'customerPays': {'type': 'number', 'description': 'The sticker price the customer is charged.'}, 'commissionBase': {'type': 'number', 'description': 'The tax-exclusive remainder Apple actually takes its cut of -- not the sticker price.'}, 'taxInsidePrice': {'type': 'number', 'description': 'VAT/GST already baked into that price, removed before commission.'}, 'appleCommission': {'type': 'number', 'description': "Apple's cut in currency."}}, 'description': 'The sticker price decomposed in the order the money is actually removed.', 'additionalProperties': False}, 'comparison': {'type': 'array', 'items': {'type': 'object', 'required': ['scenario', 'label', 'commissionPercent', 'youKeep', 'per1000Sales'], 'properties': {'label': {'type': 'string', 'description': 'Human-readable name of the commission scenario.'}, 'youKeep': {'type': 'number', 'description': 'Net per sale under that scenario.'}, 'scenario': {'type': 'string', 'description': 'Scenario identifier.'}, 'per1000Sales': {'type': 'number', 'description': 'Net across 1,000 sales, which is where the difference between scenarios becomes legible.'}, 'commissionPercent': {'type': 'number', 'description': 'Headline commission rate for that scenario.'}}, 'additionalProperties': False}, 'description': 'All three commission scenarios side by side, regardless of which was requested.'}, 'naiveComparison': {'type': 'object', 'required': ['commissionPercent', 'naiveNet', 'actualNet', 'difference', 'sameAsActual'], 'properties': {'naiveNet': {'type': 'number', 'description': 'What "just take the commission off the sticker price" would predict.'}, 'actualNet': {'type': 'number', 'description': 'What the correct tax-then-commission order actually yields.'}, 'difference': {'type': 'number', 'description': 'How far off the naive figure is, per sale.'}, 'sameAsActual': {'type': 'boolean', 'description': 'True when the storefront has no tax, so both methods agree.'}, 'commissionPercent': {'type': 'number', 'description': 'The rate a naive calculation would apply.'}}, 'description': 'A sanity check against the common mistake of applying commission to the tax-inclusive price.', 'additionalProperties': False}, 'appleShareOfStickerPercent': {'type': 'number', 'description': "Apple's commission as a percentage of the sticker price, which is lower than the headline rate because tax comes off first."}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['sex', 'height', 'weight', 'neck', 'waist'], 'properties': {'hip': {'type': 'number', 'maximum': 500, 'description': "Hip circumference at the widest point, in cm or inches. Required when sex is 'female'; ignored for 'male'.", 'exclusiveMinimum': 0}, 'sex': {'enum': ['male', 'female'], 'type': 'string', 'description': 'Sex, which selects the Navy formula variant.'}, 'neck': {'type': 'number', 'maximum': 300, 'description': 'Neck circumference, just below the larynx, in cm or inches.', 'exclusiveMinimum': 0}, 'units': {'enum': ['metric', 'imperial'], 'type': 'string', 'default': 'metric', 'description': 'metric = cm/kg, imperial = inches/lb. Applies to every measurement below.'}, 'waist': {'type': 'number', 'maximum': 500, 'description': 'Waist circumference (at the navel for men, at the narrowest point for women), in cm or inches.', 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'maximum': 300, 'description': 'Height, in cm (metric) or inches (imperial).', 'exclusiveMinimum': 0}, 'weight': {'type': 'number', 'maximum': 1500, 'description': 'Weight, in kg (metric) or lb (imperial). Used for BMI and lean mass, not for the body-fat percentage itself.', 'exclusiveMinimum': 0}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['bmi', 'bmiCategory', 'bodyFatPercent', 'bodyFatRaw', 'leanMass', 'units', 'warnings'], 'properties': {'bmi': {'type': ['number', 'null'], 'description': 'Body mass index to 1 decimal place, or null if it could not be computed.'}, 'units': {'enum': ['metric', 'imperial'], 'type': 'string', 'description': 'Which unit system leanMass is expressed in -- otherwise the bare number is ambiguous.'}, 'leanMass': {'type': ['number', 'null'], 'description': 'Lean mass in the same unit system as the input (kg for metric, lb for imperial). Null when body fat could not be computed.'}, 'warnings': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Plain-language cautions: the measurements make the formula undefined, or the result sits outside the range it was fitted on. Empty when neither applies.'}, 'bodyFatRaw': {'type': ['number', 'null'], 'description': 'The same figure before clamping and rounding, to 2 decimals -- this is the one that reveals an implausible measurement. Null in the same case as bodyFatPercent.'}, 'bmiCategory': {'type': ['string', 'null'], 'description': "The WHO band that BMI falls in, e.g. 'Underweight', 'Normal', 'Overweight', 'Obese'. Null when bmi is null."}, 'bodyFatPercent': {'type': ['number', 'null'], 'description': 'US Navy tape-method body fat as a whole percent, clamped to 2-75. Null when the measurements make the formula undefined (see warnings).'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['sex', 'age', 'activity_level', 'goal'], 'properties': {'age': {'type': 'integer', 'maximum': 100, 'minimum': 14, 'description': 'Age in years, 14-100. Every BMR formula here subtracts a per-year term, so this moves the result directly.'}, 'sex': {'enum': ['male', 'female'], 'type': 'string', 'description': 'Biological sex. Selects the sex constant in the BMR formulas (Mifflin-St Jeor +5/-161, Harris-Benedict its own pair) and the calorie safety floor the goal target is checked against (1,500 kcal/day for male, 1,200 for female).'}, 'goal': {'enum': ['lose_20', 'lose_15', 'maintain', 'gain_10'], 'type': 'string', 'description': 'Calorie adjustment applied to TDEE to get the target: lose_20 is a 20% deficit, lose_15 a 15% deficit, maintain no change, gain_10 a 10% surplus. A deficit landing under the safety floor sets below_safety_floor in the result.'}, 'units': {'enum': ['metric', 'imperial'], 'type': 'string', 'default': 'metric', 'description': "Which height/weight pair is read. 'metric' uses height_cm and weight_kg; 'imperial' uses height_ft (+ height_in) and weight_lb. The pair belonging to the other system is ignored, not merged. Defaults to 'metric'."}, 'height_cm': {'type': 'number', 'maximum': 272, 'minimum': 50, 'description': "Height in centimetres. Required when units is 'metric', ignored when units is 'imperial'."}, 'height_ft': {'type': 'integer', 'maximum': 8, 'minimum': 1, 'description': "Height, whole feet, combined with height_in. Required when units is 'imperial', ignored when units is 'metric'."}, 'height_in': {'type': 'number', 'maximum': 11, 'minimum': 0, 'description': "Height, the inches remainder on top of height_ft (0-11). Used only when units is 'imperial', and treated as 0 when omitted -- so 6 ft flat is height_ft 6 with no height_in."}, 'weight_kg': {'type': 'number', 'maximum': 300, 'minimum': 20, 'description': "Weight in kilograms. Required when units is 'metric', ignored when units is 'imperial'."}, 'weight_lb': {'type': 'number', 'maximum': 660, 'minimum': 44, 'description': "Weight in pounds, converted internally at 2.20462 lb per kg. Required when units is 'imperial', ignored when units is 'metric'."}, 'activity_level': {'enum': ['sedentary', 'light', 'moderate', 'very_active', 'extra_active'], 'type': 'string', 'description': 'Multiplier applied to BMR to reach TDEE: sedentary x1.2 (desk job, no exercise), light x1.375 (1-3 sessions/week), moderate x1.55 (3-5), very_active x1.725 (6-7), extra_active x1.9 (physical job or twice a day).'}, 'body_fat_percent': {'type': 'number', 'maximum': 60, 'minimum': 3, 'description': 'Optional. Unlocks the Katch-McArdle formula, which uses lean mass instead of total weight.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['bmr', 'lean_mass_kg', 'primary_formula', 'activity_factor', 'activity_label', 'tdee_kcal', 'goal_pct', 'goal_label', 'goal_target_kcal', 'below_safety_floor', 'safety_floor_kcal', 'safety_warning', 'macros', 'formula_comparison', 'spread_kcal', 'resolved_inputs', 'disclaimer'], 'properties': {'bmr': {'type': 'object', 'required': ['mifflin_st_jeor', 'harris_benedict', 'katch_mcardle'], 'properties': {'katch_mcardle': {'type': ['number', 'null'], 'description': 'Katch-McArdle BMR in kcal/day, or null when body_fat_percent was not supplied (it needs lean mass).'}, 'harris_benedict': {'type': 'number', 'description': 'Harris-Benedict BMR in kcal/day; tends to read a little high.'}, 'mifflin_st_jeor': {'type': 'number', 'description': 'Mifflin-St Jeor BMR in kcal/day -- the modern default.'}}, 'description': 'Basal metabolic rate by formula, before any activity multiplier.', 'additionalProperties': False}, 'macros': {'type': 'object', 'required': ['protein_g', 'fat_g', 'carbs_g'], 'properties': {'fat_g': {'type': 'number', 'description': 'Fat grams per day, from 25% of the target calories.'}, 'carbs_g': {'type': 'number', 'description': 'Carbohydrate grams per day: whatever the target has left after protein and fat, floored at 0.'}, 'protein_g': {'type': 'number', 'description': 'Protein grams per day, at 1.8 g per kg of body weight.'}}, 'description': 'A protein/fat/carb split of goal_target_kcal.', 'additionalProperties': False}, 'goal_pct': {'type': 'number', 'description': 'The goal adjustment as a signed percentage (-20, -15, 0, or +10).'}, 'tdee_kcal': {'type': 'number', 'description': 'Total daily energy expenditure in kcal/day: primary BMR x activity factor.'}, 'disclaimer': {'type': 'string', 'description': 'Standing note that these are population-average estimates, not a measurement.'}, 'goal_label': {'type': 'string', 'description': "Wording for that adjustment, e.g. '15% deficit', 'maintenance', '10% surplus'."}, 'spread_kcal': {'type': 'number', 'description': 'Difference in kcal/day between the highest and lowest TDEE among the formulas that computed.'}, 'lean_mass_kg': {'type': ['number', 'null'], 'description': 'Lean body mass in kg, or null when body_fat_percent was not supplied.'}, 'activity_label': {'type': 'string', 'description': 'The full human-readable label for that activity level.'}, 'safety_warning': {'type': ['string', 'null'], 'description': 'The full warning text when below_safety_floor is true, otherwise null.'}, 'activity_factor': {'type': 'number', 'description': 'The multiplier the chosen activity_level maps to (1.2 to 1.9).'}, 'primary_formula': {'type': 'string', 'description': "Which formula drove the headline numbers: 'Katch-McArdle' when body fat % was given, otherwise 'Mifflin-St Jeor'."}, 'resolved_inputs': {'type': 'object', 'required': ['height_cm', 'weight_kg'], 'properties': {'height_cm': {'type': 'number', 'description': 'Height in cm after any imperial conversion.'}, 'weight_kg': {'type': 'number', 'description': 'Weight in kg after any imperial conversion.'}}, 'description': 'What the imperial/metric inputs actually resolved to internally -- the numbers every formula above was fed.', 'additionalProperties': False}, 'goal_target_kcal': {'type': 'number', 'description': 'The goal-adjusted daily calorie target in kcal.'}, 'safety_floor_kcal': {'type': 'number', 'description': 'The floor that was checked against: 1500 kcal/day for male, 1200 for female.'}, 'below_safety_floor': {'type': 'boolean', 'description': 'True when a deficit target falls below the usual floor for this sex -- the one field worth checking before presenting the target.'}, 'formula_comparison': {'type': 'array', 'items': {'type': 'object', 'required': ['formula', 'bmr_kcal', 'tdee_kcal', 'best_for', 'is_primary'], 'properties': {'formula': {'type': 'string', 'description': 'Formula name.'}, 'best_for': {'type': 'string', 'description': 'One line on when this formula is the right one to trust.'}, 'bmr_kcal': {'type': ['number', 'null'], 'description': "That formula's BMR, or null if it could not be computed."}, 'tdee_kcal': {'type': ['number', 'null'], 'description': "That formula's BMR times the activity factor, or null."}, 'is_primary': {'type': 'boolean', 'description': 'True for the row that produced the headline tdee_kcal.'}}, 'additionalProperties': False}, 'description': 'All three formulas side by side, so the spread is visible rather than implied.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['foreground', 'background'], 'properties': {'background': {'type': 'string', 'maxLength': 64, 'minLength': 1, 'description': 'Background colour as a hex string, same format as foreground.'}, 'foreground': {'type': 'string', 'maxLength': 64, 'minLength': 1, 'description': 'Foreground/text colour as a hex string, e.g. "#6b7280" or "6b7" (3- or 6-digit, leading # optional).'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['foregroundHex', 'backgroundHex', 'ratio', 'ratioDisplay', 'apca', 'cases', 'summary'], 'properties': {'apca': {'type': 'object', 'required': ['lc', 'lcAbs', 'polarity'], 'properties': {'lc': {'type': 'number', 'description': 'APCA lightness contrast, signed -- the sign encodes which of the two colours is lighter.'}, 'lcAbs': {'type': 'number', 'description': 'Absolute Lc value, which is what the APCA thresholds are stated against.'}, 'polarity': {'type': 'string', 'description': 'Whether this is light text on dark, or dark text on light.'}}, 'description': 'The APCA (WCAG 3 draft) reading, which models perceived contrast rather than a pure luminance ratio and often disagrees with WCAG 2.', 'additionalProperties': False}, 'cases': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'label', 'need', 'aaThreshold', 'aaaThreshold', 'passAA', 'passAAA'], 'properties': {'key': {'type': 'string', 'description': 'Stable identifier for the use case.'}, 'need': {'type': 'string', 'description': 'What this case requires, written out.'}, 'label': {'type': 'string', 'description': "Human-readable name, e.g. 'Normal text'."}, 'passAA': {'type': 'boolean', 'description': 'Whether the pair meets AA for this case.'}, 'passAAA': {'type': ['boolean', 'null'], 'description': 'Whether it meets AAA, or null where no AAA level exists.'}, 'aaThreshold': {'type': 'number', 'description': 'The AA ratio this case must meet.'}, 'aaaThreshold': {'type': ['number', 'null'], 'description': 'The AAA ratio, or null for cases WCAG defines no AAA level for (UI components).'}}, 'additionalProperties': False}, 'description': 'The pair judged against each WCAG use case, since one ratio passes for large text and fails for body copy.'}, 'ratio': {'type': 'number', 'description': 'WCAG 2 contrast ratio, from 1 (identical) to 21 (black on white).'}, 'summary': {'type': 'object', 'required': ['passed', 'graded', 'allPass'], 'properties': {'graded': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many checks were gradeable (a null AAA level is not counted).'}, 'passed': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many graded checks passed.'}, 'allPass': {'type': 'boolean', 'description': 'True only when every gradeable check passed.'}}, 'description': 'The tally, so a caller can gate on one boolean instead of walking cases.', 'additionalProperties': False}, 'ratioDisplay': {'type': 'string', 'description': "That ratio formatted the way it is conventionally written, e.g. '4.53:1'."}, 'backgroundHex': {'type': 'string', 'description': 'The background colour normalised to hex.'}, 'foregroundHex': {'type': 'string', 'description': 'The foreground colour normalised to hex.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'content'], 'properties': {'name': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'File name, e.g. "en.lproj/Localizable.strings" -- shown in the report and used to auto-select the base file.'}, 'content': {'type': 'string', 'minLength': 1, 'description': "Base64-encoded RAW BYTES of the file (not its decoded text) -- send it exactly as read from disk so BOM sniffing and UTF-16 decoding work the same way the browser tool's FileReader does."}}}, 'maxItems': 40, 'minItems': 2, 'description': 'Two to 40 .strings files to compare against each other.'}, 'baseFile': {'type': 'string', 'maxLength': 255, 'description': 'Exact name of one of files[] to treat as the base ("compare against") file. When omitted, auto-selects the first file (after sorting all names alphabetically) whose name starts with "base." / "base-" / "base_" or "en." / "en-" / "en_" (case-insensitive), falling back to the alphabetically-first file if none match. A name that does not match any loaded file falls back the same way.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['baseFile', 'fileCount', 'keysInBase', 'issueCount', 'missingKeys', 'extraKeys', 'duplicateValues', 'identicalToBase', 'badLines', 'missingKeysStrings', 'files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'encoding', 'keyCount', 'badLineCount'], 'properties': {'name': {'type': 'string', 'description': 'Filename as given.'}, 'encoding': {'type': 'string', 'description': 'The encoding the file was decoded as -- .strings files are frequently UTF-16, and a wrong guess here explains a zero key count.'}, 'keyCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Keys parsed from this file.'}, 'badLineCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Unparseable lines in this file.'}}, 'additionalProperties': False}, 'description': 'Per-file summary, including the base file.'}, 'badLines': {'type': 'array', 'items': {'type': 'object', 'required': ['file', 'line', 'text'], 'properties': {'file': {'type': 'string', 'description': 'The file containing the line.'}, 'line': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': '1-based line number.'}, 'text': {'type': 'string', 'description': 'The line as written, so it can be found and fixed.'}}, 'additionalProperties': False}, 'description': 'Lines that are neither a comment, blank, nor a parseable key/value pair -- typically a missing semicolon or an unescaped quote.'}, 'baseFile': {'type': 'string', 'description': 'Which file every other file was compared against, whether given or chosen automatically.'}, 'extraKeys': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'file', 'value'], 'properties': {'key': {'type': 'string', 'description': 'The key not present in the base file.'}, 'file': {'type': 'string', 'description': 'The file carrying it.'}, 'value': {'type': 'string', 'description': 'Its value in that file.'}}, 'additionalProperties': False}, 'description': 'Keys in a translation that the base file no longer has -- usually left behind by a rename or a deletion.'}, 'fileCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many files were compared.'}, 'issueCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Total findings across every category below. Zero means the files agree.'}, 'keysInBase': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Number of keys in the base file -- the denominator for the translation coverage.'}, 'missingKeys': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'file', 'baseValue'], 'properties': {'key': {'type': 'string', 'description': 'The key absent from this file.'}, 'file': {'type': 'string', 'description': 'The file missing it.'}, 'baseValue': {'type': 'string', 'description': "The base file's value for that key, i.e. the string still to be translated."}}, 'additionalProperties': False}, 'description': 'Keys present in the base file but absent from another -- untranslated strings that will fall back at runtime.'}, 'duplicateValues': {'type': 'array', 'items': {'type': 'object', 'required': ['file', 'value', 'keys'], 'properties': {'file': {'type': 'string', 'description': 'The file containing the duplicates.'}, 'keys': {'type': 'string', 'description': 'The keys sharing it, comma-separated.'}, 'value': {'type': 'string', 'description': 'The repeated value.'}}, 'additionalProperties': False}, 'description': 'Keys within one file that share a value, which is how a copy-paste translation error looks.'}, 'identicalToBase': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'file', 'value'], 'properties': {'key': {'type': 'string', 'description': 'The key whose value matches the base file.'}, 'file': {'type': 'string', 'description': 'The translation file.'}, 'value': {'type': 'string', 'description': 'The shared value.'}}, 'additionalProperties': False}, 'description': 'Keys whose translation is byte-identical to the base language. Sometimes correct (a proper noun), often a forgotten translation.'}, 'missingKeysStrings': {'type': 'string', 'description': 'Every missing key formatted as ready-to-paste .strings entries with the base value, so the gap can be filled without retyping. Empty when nothing is missing.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'object', 'required': ['filename', 'dataBase64'], 'properties': {'filename': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'Original filename. Used only to derive the output name and to label report rows -- never trusted to identify the format.'}, 'dataBase64': {'type': 'string', 'minLength': 1, 'description': 'The file bytes, base64-encoded. Each decodes to at most 4000000 bytes, and the whole batch to at most 4000000 bytes combined.'}}}, 'maxItems': 50, 'minItems': 1, 'description': '1 to 50 files, in the order results are reported. Mix HEIC/HEIF and already-JPEG/PNG files freely -- each is byte-sniffed on its own. The batch is additionally capped at 4000000 bytes of combined decoded input, which is what binds in practice for real photos.'}, 'format': {'enum': ['image/jpeg', 'image/png'], 'type': 'string', 'default': 'image/jpeg', 'description': 'Output format for any real HEIC/HEIF input. Ignored for input already sniffed as JPEG or PNG, which is passed through unchanged rather than re-encoded.'}, 'quality': {'type': 'integer', 'default': 90, 'maximum': 100, 'minimum': 50, 'description': 'JPEG quality, 50-100. Ignored when format is image/png (PNG is lossless).'}, 'bundleAsZip': {'type': 'boolean', 'default': False, 'description': 'When true and more than one file produced output bytes (converted or passed-through), bundle them into one converted.zip instead of returning each file as its own separate output.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['format', 'results'], 'properties': {'format': {'enum': ['image/jpeg', 'image/png'], 'type': 'string', 'description': 'Output MIME type requested for the batch.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['filename', 'outputFilename', 'status', 'mimeType', 'width', 'height', 'inputBytes', 'outputBytes'], 'properties': {'error': {'type': 'string', 'description': 'Why this file could not be converted. Present only on a failed row -- one bad file does not fail the batch.'}, 'width': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Decoded width in px. Null for a failed file, and also for a passed-through one, which is never decoded.'}, 'height': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Decoded height in px, on the same terms as width.'}, 'status': {'enum': ['converted', 'already_converted', 'failed'], 'type': 'string', 'description': "Per-file outcome. 'already_converted' means the input was already a JPEG or PNG and was passed through untouched rather than re-encoded."}, 'filename': {'type': 'string', 'description': 'The input filename, echoed back so rows line up with what was sent.'}, 'mimeType': {'type': ['string', 'null'], 'description': 'MIME type of the produced file, or null when this input failed.'}, 'inputBytes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Size of the supplied file in bytes.'}, 'outputBytes': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Size of the produced file in bytes, or null when this input failed.'}, 'outputFilename': {'type': ['string', 'null'], 'description': 'Name of the produced file, or null when this input failed.'}}, 'additionalProperties': False}, 'description': 'One row per input file, in the order supplied. Rows come in three shapes depending on status.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['videoBase64', 'mimeType', 'endSeconds'], 'properties': {'fps': {'enum': [10, 12, 15, 20, 25], 'type': 'number', 'default': 10, 'description': 'Target sampling/output frame rate: 10 (default), 12, 15, 20 or 25. Higher fps spends the frame budget faster, so it shortens the trim range that will fit. For GIF, the true achieved rate is reported back as actualFps and will differ slightly due to whole-centisecond frame delays.'}, 'size': {'enum': [0, 720, 480, 320, 240], 'type': 'number', 'default': 320, 'description': "Output width in px: 0 keeps the source's own width (clamped to 720); otherwise 720, 480, 320 (default) or 240. Height is derived to preserve aspect ratio; both dimensions are forced even. Bigger sizes buy fewer frames -- width x height x frames is capped at 12 megapixels."}, 'speed': {'enum': [0.5, 1, 1.5, 2], 'type': 'number', 'default': 1, 'description': 'Playback speed multiplier: 0.5, 1 (default), 1.5 or 2. Higher speed samples fewer frames per second of source video (and so fits a longer trim); 0.5 samples twice as many.'}, 'dither': {'type': 'boolean', 'default': True, 'description': 'Floyd-Steinberg dithering for the GIF palette (default true). Smooths gradients at the cost of file size and adds noise to flat graphics -- turn off for screen recordings or flat artwork. Ignored for mp4/webm.'}, 'format': {'enum': ['gif', 'mp4', 'webm'], 'type': 'string', 'default': 'gif', 'description': "Output container. 'gif' (default) runs the full sampling + shared-palette + LZW pipeline. 'mp4' (H.264) and 'webm' (VP9) skip that pipeline and have ffmpeg encode the trimmed/scaled/speed-adjusted clip directly, with audio always dropped."}, 'motion': {'enum': ['loop', 'bounce', 'once'], 'type': 'string', 'default': 'loop', 'description': "'loop' (restarts from the first frame each cycle), 'bounce' (plays forward then backward, never visibly cuts -- roughly doubles the emitted frame count and so halves the span that fits the pixel budget), or 'once' (plays through and stops -- GIF only, disables looping)."}, 'colours': {'enum': [256, 128, 64], 'type': 'number', 'default': 256, 'description': 'GIF palette size: 256 (default), 128 or 64 shared colours across the whole clip. Ignored for mp4/webm.'}, 'mimeType': {'type': 'string', 'minLength': 1, 'description': 'The source video\'s mime type, e.g. "video/quicktime" or "video/mp4". Used only to pick a temp-file extension; the actual format is content-sniffed by ffmpeg.'}, 'endSeconds': {'type': 'number', 'description': 'Trim end, in seconds. Must leave at least 0.25s and at most 10s between startSeconds and endSeconds.', 'exclusiveMinimum': 0}, 'videoBase64': {'type': 'string', 'minLength': 1, 'description': 'Base64-encoded source video bytes (not a file path or URL). The decoded video must be at most 4 MB; larger payloads are rejected before any decoding happens.'}, 'startSeconds': {'type': 'number', 'default': 0, 'minimum': 0, 'description': "Trim start, in seconds from the beginning of the video. Clamped to the video's own duration."}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['format', 'width', 'height', 'byteSize', 'requestedFps', 'actualFps', 'motion', 'speed', 'outputPixels', 'maxOutputPixels'], 'properties': {'audio': {'type': 'string', 'description': 'What happened to the source audio track. mp4/webm output only.'}, 'speed': {'type': 'number', 'description': 'Speed multiplier applied to the source.'}, 'width': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Output width in px.'}, 'dither': {'type': 'boolean', 'description': 'Whether dithering was applied during quantisation. GIF output only.'}, 'format': {'enum': ['gif', 'mp4', 'webm'], 'type': 'string', 'description': 'Output format. This field decides which of the conditional fields below are present.'}, 'height': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Output height in px.'}, 'motion': {'enum': ['loop', 'bounce', 'once'], 'type': 'string', 'description': 'Playback behaviour applied.'}, 'trimEnd': {'type': 'number', 'description': 'End of the trimmed span in seconds. GIF output only.'}, 'byteSize': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Size of the produced file in bytes.'}, 'trimSpan': {'type': 'number', 'description': 'Length of the trimmed span in seconds. GIF output only.'}, 'actualFps': {'type': 'number', 'description': "The frame rate actually achieved, which can differ because frames are sampled by ffmpeg's fps filter rather than seeking to exact times."}, 'maxColors': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Palette size the median-cut quantiser was allowed. GIF output only.'}, 'trimStart': {'type': 'number', 'description': 'Start of the trimmed span in seconds. GIF output only.'}, 'frameCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Number of frames encoded. GIF output only.'}, 'outputPixels': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': "Width x height x frames -- the bound that actually governs this tool's memory use."}, 'requestedFps': {'type': 'number', 'description': 'The frame rate that was asked for.'}, 'durationSeconds': {'type': 'number', 'description': 'Duration of the produced clip in seconds. mp4/webm output only.'}, 'maxOutputPixels': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'The ceiling outputPixels was checked against, so a rejection is explicable from the result.'}, 'delayCentiseconds': {'type': 'number', 'description': 'Per-frame delay written into the GIF, in centiseconds. GIF output only.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['minSizePx', 'minViewportPx', 'maxSizePx', 'maxViewportPx'], 'properties': {'maxSizePx': {'type': 'number', 'description': 'Size in px at the large viewport.'}, 'minSizePx': {'type': 'number', 'description': 'Size in px at the small viewport.'}, 'typeScale': {'type': 'object', 'properties': {'ratio': {'type': 'number', 'default': 1.2, 'description': 'Multiplier applied per step (e.g. 1.25, a minor third).', 'exclusiveMinimum': 0}, 'steps': {'type': 'integer', 'default': 5, 'maximum': 8, 'minimum': 1, 'description': 'Number of scale steps, 1-8.'}}, 'description': 'Optional: when provided, also returns a fluid type scale of this many steps, each step scaling both endpoints by ratio^step.'}, 'maxViewportPx': {'type': 'number', 'description': 'The large viewport width in px.'}, 'minViewportPx': {'type': 'number', 'description': 'The small viewport width in px.'}, 'rootFontSizePx': {'type': 'number', 'default': 16, 'description': 'Root font size in px used to convert the px sizes to rem. Defaults to 16; a value of 0 also falls back to 16.'}, 'previewViewportsPx': {'type': 'array', 'items': {'type': 'number'}, 'maxItems': 64, 'description': 'Optional list of viewport widths (px), up to 64, to evaluate the resulting clamp() at, returned as computed pixel sizes.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['status', 'note', 'css', 'math', 'preview', 'scale'], 'properties': {'css': {'type': ['string', 'null'], 'description': 'The finished CSS clamp() declaration in rem, or null when status is sameViewports.'}, 'math': {'anyOf': [{'type': 'object', 'required': ['minRem', 'maxRem', 'interceptRem', 'slopeVw'], 'properties': {'maxRem': {'type': 'number', 'description': 'Upper bound of the clamp, in rem.'}, 'minRem': {'type': 'number', 'description': 'Lower bound of the clamp, in rem.'}, 'slopeVw': {'type': 'number', 'description': 'The vw coefficient of the middle expression, i.e. rem gained per 1% of viewport width.'}, 'interceptRem': {'type': 'number', 'description': 'The constant rem term of the middle (preferred) expression.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'The four numbers the css string is assembled from, each rounded to 4 decimal places. Null when status is sameViewports.'}, 'note': {'type': 'string', 'description': 'Human-readable explanation of a non-ok status, or an empty string when status is ok.'}, 'scale': {'type': 'array', 'items': {'type': 'object', 'required': ['step', 'ratioApplied', 'minSizePx', 'maxSizePx', 'css'], 'properties': {'css': {'type': 'string', 'description': 'The clamp() declaration for this step.'}, 'step': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': '1-based step index in the scale.'}, 'maxSizePx': {'type': 'number', 'description': "This step's size at the large viewport, in px."}, 'minSizePx': {'type': 'number', 'description': "This step's size at the small viewport, in px."}, 'ratioApplied': {'type': 'number', 'description': 'ratio raised to (step - 1), the multiplier applied to both endpoints.'}}, 'additionalProperties': False}, 'description': 'The fluid type scale, one entry per step. Empty when typeScale was omitted or no step could be built.'}, 'status': {'enum': ['ok', 'sameViewports', 'flat', 'inverted'], 'type': 'string', 'description': "'ok' for a normal fluid size; 'sameViewports' when the two viewport widths match, so no line can be drawn and css is null; 'flat' when both sizes are equal (a constant, clamp() unneeded); 'inverted' when the max size is below the min, which is valid CSS that shrinks as the viewport grows."}, 'preview': {'type': 'array', 'items': {'type': 'object', 'required': ['viewportPx', 'computedSizePx'], 'properties': {'viewportPx': {'type': 'number', 'description': 'The viewport width that was evaluated, echoed from previewViewportsPx.'}, 'computedSizePx': {'type': 'number', 'description': 'What the clamp() resolves to at that width, in px, rounded to 2 decimals.'}}, 'additionalProperties': False}, 'description': 'One entry per requested preview viewport, in the order given. Empty when previewViewportsPx was omitted.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['text'], 'properties': {'text': {'type': 'string', 'maxLength': 1000000, 'description': 'The text to estimate, up to 1000000 characters (roughly 250K tokens). An empty string is valid and yields 0 tokens.'}, 'calls': {'type': 'number', 'default': 1, 'maximum': 1000000000, 'description': 'Number of times this input/output pair will be sent, to scale total cost. Defaults to 1; values below 1 are treated as 1.', 'exclusiveMinimum': 0}, 'contextWindows': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'sizeTokens'], 'properties': {'name': {'type': 'string', 'maxLength': 512}, 'sizeTokens': {'type': 'number', 'exclusiveMinimum': 0}}}, 'maxItems': 64, 'description': 'Custom context windows to check fit against, e.g. [{"name":"my-model","sizeTokens":32000}]. Omit to use the site default set (8K, 128K, 200K, 1M, 2M).'}, 'expectedOutputTokens': {'type': 'number', 'default': 500, 'maximum': 10000000, 'minimum': 0, 'description': 'Assumed reply length in tokens, used only to estimate output cost. Defaults to 500.'}, 'inputPricePerMillionUsd': {'type': 'number', 'minimum': 0, 'description': "USD price per 1,000,000 input tokens, from the provider's current pricing page. Omit to skip input cost -- no default is assumed, since a stale hardcoded price would be worse than none."}, 'outputPricePerMillionUsd': {'type': 'number', 'minimum': 0, 'description': 'USD price per 1,000,000 output tokens. Omit to skip output cost.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['tokens', 'characters', 'words', 'charsPerToken', 'readingTime', 'accuracyBand', 'contextFit', 'cost'], 'properties': {'cost': {'type': 'object', 'required': ['inputCost', 'outputCost', 'totalCost'], 'properties': {'inputCost': {'type': ['number', 'null'], 'description': 'USD to send this text, or null when no input price was supplied.'}, 'totalCost': {'type': ['number', 'null'], 'description': 'Input plus output, multiplied by calls. Null when either price was omitted.'}, 'outputCost': {'type': ['number', 'null'], 'description': 'USD for the expected output, or null when no output price was supplied.'}}, 'description': 'Projected spend. Every field is null unless the matching per-million price was supplied.', 'additionalProperties': False}, 'words': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Whitespace-delimited word count.'}, 'tokens': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Estimated token count for the text.'}, 'characters': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Character count of the input text.'}, 'contextFit': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'sizeTokens', 'percentUsed', 'fits', 'comfortable', 'verdict', 'overByTokens'], 'properties': {'fits': {'type': 'boolean', 'description': 'Whether the text fits at all.'}, 'name': {'type': 'string', 'description': 'Name of the context window being checked against.'}, 'verdict': {'type': 'string', 'description': "One-word summary, e.g. 'fits' or 'over'."}, 'sizeTokens': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': "That window's size in tokens."}, 'comfortable': {'type': 'boolean', 'description': 'Whether it fits with enough headroom left for a useful reply.'}, 'percentUsed': {'type': 'number', 'description': 'What percentage of the window the text would occupy.'}, 'overByTokens': {'type': ['number', 'null'], 'description': 'How many tokens too long the text is, or null when it fits.'}}, 'additionalProperties': False}, 'description': 'The text measured against each context window, so the caller sees which models it fits.'}, 'readingTime': {'type': 'object', 'required': ['underOneMinute', 'minutes'], 'properties': {'minutes': {'type': ['number', 'null'], 'description': 'Whole minutes to read at an average pace, or null when underOneMinute is true.'}, 'underOneMinute': {'type': 'boolean', 'description': 'True when the text reads in under a minute, in which case minutes is null.'}}, 'description': 'How long the text takes a person to read, as a sanity check on the size.', 'additionalProperties': False}, 'accuracyBand': {'type': 'object', 'required': ['level', 'approxRange', 'note'], 'properties': {'note': {'type': 'string', 'description': 'What about the text put it in this band, and which way it is likely to be wrong.'}, 'level': {'type': 'string', 'description': 'How trustworthy this estimate is for text of this kind.'}, 'approxRange': {'type': 'string', 'description': 'The expected error range, e.g. a percentage spread.'}}, 'description': 'An honesty bound on the token count: this is a heuristic, not a real tokenizer, and the band says how far off it usually is.', 'additionalProperties': False}, 'charsPerToken': {'type': 'number', 'description': 'Characters divided by tokens -- the density that drives the accuracy band.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['hemisphere', 'aspect', 'blocked', 'distance'], 'properties': {'aspect': {'enum': ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'], 'type': 'string', 'description': 'True compass direction the window faces (before any hemisphere adjustment).'}, 'blocked': {'enum': ['clear', 'sheer', 'near', 'heavy'], 'type': 'string', 'description': "What stands between the glass and the open sky: 'clear' = nothing, 'sheer' = a net curtain/blind or distant trees, 'near' = a tree or building close by, 'heavy' = mostly blocked."}, 'distance': {'enum': ['sill', 'd1', 'd2', 'd3', 'd4'], 'type': 'string', 'description': "How far back from the glass the plant sits: 'sill' = on the sill, 'd1' = within an arm's reach, 'd2' = one to two metres back, 'd3' = two to three metres back, 'd4' = further into the room."}, 'hemisphere': {'enum': ['north', 'south'], 'type': 'string', 'description': 'Hemisphere the window is in. South of the equator the sun tracks the northern sky, so the compass direction that gets the strongest light is reversed from what most (northern-hemisphere-written) plant guides assume.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['score', 'band', 'aspect', 'solarAspect', 'verdict', 'verdictSub', 'reasoning', 'plants'], 'properties': {'band': {'type': 'string', 'description': 'The score bucketed into a named light level, the single field most callers want.'}, 'score': {'type': 'number', 'description': 'The computed light score the band and verdict are derived from -- higher is brighter.'}, 'aspect': {'type': 'string', 'description': 'The compass direction the window faces, echoed from the input.'}, 'plants': {'type': 'string', 'description': 'Plant types suited to this light level.'}, 'verdict': {'type': 'string', 'description': 'One-line summary of what this window is good for.'}, 'reasoning': {'type': 'string', 'description': 'Why the score came out where it did, naming the aspect, glazing and distance contributions.'}, 'verdictSub': {'type': 'string', 'description': 'A supporting line qualifying the verdict.'}, 'solarAspect': {'type': 'string', 'description': 'That aspect mapped to its solar equivalent for the given hemisphere -- a south-facing window means the opposite thing north and south of the equator.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['foreground', 'background', 'adjust'], 'properties': {'adjust': {'enum': ['foreground', 'background'], 'type': 'string', 'description': 'Which colour to move toward passing; the other one stays fixed.'}, 'target': {'anyOf': [{'enum': ['normal-aa', 'normal-aaa', 'large-aa', 'large-aaa', 'ui-aa'], 'type': 'string'}, {'type': 'number', 'exclusiveMinimum': 0}], 'default': 'normal-aa', 'description': "WCAG threshold to clear: 'normal-aa' 4.5:1 (default, matches the page's buttons), 'normal-aaa' 7:1, 'large-aa'/'ui-aa' 3:1, 'large-aaa' 4.5:1, or any custom positive ratio."}, 'background': {'type': 'string', 'maxLength': 64, 'minLength': 1, 'description': 'Background colour as a hex string, same format as foreground.'}, 'foreground': {'type': 'string', 'maxLength': 64, 'minLength': 1, 'description': 'Foreground/text colour as a hex string, e.g. "#6b7280" (3- or 6-digit, leading # optional).'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['adjust', 'targetRatio', 'currentRatio', 'alreadyPassing', 'found', 'movedHex', 'newRatio', 'lightnessStepPercent', 'direction', 'message'], 'properties': {'found': {'type': 'boolean', 'description': 'Whether a passing colour was reached. False means the target is unreachable by lightness alone from this starting colour.'}, 'adjust': {'enum': ['foreground', 'background'], 'type': 'string', 'description': 'Which colour was moved, echoed from the input.'}, 'message': {'type': 'string', 'description': 'Plain-language summary of the outcome, including why no colour was found when found is false.'}, 'movedHex': {'type': ['string', 'null'], 'description': 'The adjusted colour in hex, or null when nothing was moved or nothing was found.'}, 'newRatio': {'type': ['number', 'null'], 'description': 'The contrast ratio after the move, or null when there was no move.'}, 'direction': {'type': ['string', 'null'], 'description': 'Whether the colour was lightened or darkened; null when nothing moved.'}, 'targetRatio': {'type': 'number', 'description': 'The contrast ratio being aimed for, resolved from the named target or given directly.'}, 'currentRatio': {'type': 'number', 'description': 'The ratio the original pair had.'}, 'alreadyPassing': {'type': 'boolean', 'description': 'True when the input pair already met the target and nothing needed moving.'}, 'lightnessStepPercent': {'type': ['number', 'null'], 'description': 'How far the colour had to travel in lightness, as a percentage -- a large value means the passing colour is no longer the colour that was asked for.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['imageBase64'], 'properties': {'variants': {'enum': ['none', 'dark', 'all'], 'type': 'string', 'default': 'all', 'description': "Which iOS appearance variants to include alongside the required light AppIcon.png. 'none': light only. 'dark': light + AppIcon-Dark.png. 'all': light + AppIcon-Dark.png + AppIcon-Tinted.png. Contents.json is written to match whichever set is chosen."}, 'imageBase64': {'type': 'string', 'minLength': 1, 'description': 'Base64-encoded source image bytes (PNG, JPEG, or WebP). 1024x1024 is ideal; anything else is padded to square and/or scaled.'}, 'backgroundColor': {'type': 'string', 'default': '#ffffff', 'maxLength': 512, 'minLength': 1, 'description': 'CSS/hex colour (e.g. "#ffffff") used to flatten transparency and to pad a non-square source before it is centered onto a square canvas.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['source', 'hadAlpha', 'variants', 'backgroundColor', 'filesOut', 'warnings', 'files'], 'properties': {'files': {'type': 'array', 'items': {'type': 'object', 'required': ['where', 'path', 'width', 'height'], 'properties': {'path': {'type': 'string', 'description': 'Path of the file inside the ZIP.'}, 'where': {'type': 'string', 'description': 'Which part of the set this file belongs to (the Xcode appiconset, an Android mipmap bucket, or the flat sizes folder).'}, 'width': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Width in px, or null for a non-image entry such as Contents.json.'}, 'height': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Height in px, or null for a non-image entry such as Contents.json.'}}, 'additionalProperties': False}, 'description': 'Every file in the archive, so the contents can be checked without unzipping it.'}, 'source': {'type': 'object', 'required': ['width', 'height'], 'properties': {'width': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Source image width in px.'}, 'height': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Source image height in px.'}}, 'description': 'Dimensions of the image that was supplied, before squaring.', 'additionalProperties': False}, 'filesOut': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Total number of files inside the ZIP.'}, 'hadAlpha': {'type': 'boolean', 'description': 'True when the source carried transparency, which was flattened onto backgroundColor because Apple rejects icons with alpha.'}, 'variants': {'enum': ['none', 'dark', 'all'], 'type': 'string', 'description': 'Which appearance variants were generated, echoed from the input.'}, 'warnings': {'type': 'object', 'required': ['notSquare', 'small'], 'properties': {'small': {'type': ['string', 'null'], 'description': 'Set when the source was under 1024px on its longest side, so the largest icons are upscaled; null when it was big enough.'}, 'notSquare': {'type': ['string', 'null'], 'description': 'Set when the source was not square and had to be letterboxed onto a square canvas; null when it was already square.'}}, 'description': 'Non-fatal quality warnings. Both are null on an ideal 1024px square source -- neither stops the ZIP being produced.', 'additionalProperties': False}, 'backgroundColor': {'type': 'string', 'description': 'The colour transparency was flattened onto, and the letterbox colour for a non-square source.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['imageBase64'], 'properties': {'siteName': {'type': 'string', 'default': 'My site', 'maxLength': 45, 'description': 'Full site name, used as the manifest\'s "name" field and as the fallback for short_name / the apple-mobile-web-app-title meta tag when shortName is empty.'}, 'shortName': {'type': 'string', 'default': '', 'maxLength': 12, 'description': 'Short name for a home-screen label (roughly 12 characters fit). Used as the manifest\'s "short_name" and in the apple-mobile-web-app-title meta tag; falls back to siteName when empty.'}, 'themeColor': {'type': 'string', 'default': '#0a0a0c', 'maxLength': 512, 'minLength': 1, 'description': "Hex colour (# optional, 3- or 6-digit) written to the manifest's theme_color field. Purely metadata -- never painted onto any icon."}, 'imageBase64': {'type': 'string', 'minLength': 1, 'description': "Source image, base64-encoded. Any raster/SVG format @napi-rs/canvas can decode (PNG, JPEG, WebP, GIF, SVG). May be non-square and may carry transparency -- it is centred on a square canvas before anything else happens to it. Capped by this server's per-input byte limit."}, 'backgroundColor': {'type': 'string', 'default': '#ffffff', 'maxLength': 512, 'minLength': 1, 'description': "Hex colour (# optional, 3- or 6-digit) used three ways: the manifest's background_color field, the flatten colour behind the apple-touch-icon (iOS does not honour alpha there), and the padding colour around the maskable-cropped manifest icons."}, 'maskablePadding': {'type': 'boolean', 'default': True, 'description': 'When true (default), the 192x192 and 512x512 manifest icons are padded: the artwork is shrunk to a centred 80%-width square on the background colour, matching Android\'s maskable-icon safe zone, and the manifest icons\' "purpose" is set to "maskable". When false, those two icons are the plain resized artwork with "purpose": "any".'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['manifest', 'snippet', 'table', 'sourceWidth', 'sourceHeight', 'squaredSide', 'maskablePadding', 'themeColor', 'backgroundColor', 'warning'], 'properties': {'table': {'type': 'array', 'items': {'type': 'object', 'required': ['file', 'sizes', 'usedFor'], 'properties': {'file': {'type': 'string', 'description': 'Generated filename.'}, 'sizes': {'type': 'string', 'description': 'Pixel dimensions the file covers.'}, 'usedFor': {'type': 'string', 'description': 'Which browser, platform or surface asks for this file.'}}, 'additionalProperties': False}, 'description': 'Every generated file and what it is for, so the set can be checked without unzipping it.'}, 'snippet': {'type': 'string', 'description': 'The <link> and <meta> tags to paste into the page head, matching the files that were generated.'}, 'warning': {'type': ['string', 'null'], 'description': 'A quality caution about the source image, chiefly that it was not square or too small. Null when there is nothing to flag.'}, 'manifest': {'type': 'string', 'description': 'A complete web app manifest as JSON text, ready to serve as site.webmanifest.'}, 'themeColor': {'type': 'string', 'description': 'Theme colour written into the manifest and meta tags.'}, 'sourceWidth': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Source image width in px.'}, 'squaredSide': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Side length of the square canvas the source was fitted onto, in px.'}, 'sourceHeight': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Source image height in px.'}, 'backgroundColor': {'type': 'string', 'description': 'Background colour written into the manifest.'}, 'maskablePadding': {'type': 'boolean', 'description': "Whether the maskable icon was padded to survive Android's safe-zone crop."}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['imageBase64'], 'properties': {'format': {'enum': ['jpeg', 'webp', 'avif'], 'type': 'string', 'default': 'webp', 'description': "Output format. 'webp' (default, matches the source's own default whenever WebP is available) is smaller than JPEG at equivalent visual quality; 'jpeg' is the safest choice for old viewers or print; 'avif' is smaller still but slower to encode."}, 'quality': {'type': 'integer', 'default': 75, 'maximum': 100, 'minimum': 5, 'description': "Encoder quality, 5-100 (matches the source's slider range). Defaults to 75. 100 is the least-lossy setting the encoder offers, not truly lossless."}, 'imageBase64': {'type': 'string', 'description': 'Base64-encoded source image bytes (not a file path or URL).'}, 'maxDimension': {'type': 'integer', 'default': 1600, 'maximum': 4000, 'minimum': 1, 'description': 'Longer-side cap in pixels before encoding; the image is downscaled to fit inside this (aspect preserved) and is never enlarged. Defaults to 1600, matching the source.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['format', 'quality', 'original', 'working', 'compressed', 'percentChange'], 'properties': {'format': {'enum': ['jpeg', 'webp', 'avif'], 'type': 'string', 'description': 'Output format used.'}, 'quality': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Quality level the image was encoded at.'}, 'working': {'type': 'object', 'required': ['width', 'height', 'maxDimension'], 'properties': {'width': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Width after the downscale, in px.'}, 'height': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Height after the downscale, in px.'}, 'maxDimension': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'The longest-side cap that was applied.'}}, 'description': 'The image after being fitted to maxDimension but before re-encoding. Never an enlargement.', 'additionalProperties': False}, 'original': {'type': 'object', 'required': ['width', 'height', 'bytes'], 'properties': {'bytes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Original file size in bytes.'}, 'width': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Original width in px.'}, 'height': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Original height in px.'}}, 'description': 'The image as supplied.', 'additionalProperties': False}, 'compressed': {'type': 'object', 'required': ['width', 'height', 'bytes'], 'properties': {'bytes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Output file size in bytes.'}, 'width': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Output width in px.'}, 'height': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Output height in px.'}}, 'description': 'The returned file. Its bytes come back as a separate content block.', 'additionalProperties': False}, 'percentChange': {'type': 'number', 'description': 'Size change against the original as a percentage; negative means smaller. Can be positive when re-encoding an already-optimised file.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['imageBase64'], 'properties': {'format': {'enum': ['jpeg', 'webp', 'avif'], 'type': 'string', 'default': 'webp', 'description': "Format to sample the curve in. Defaults to 'webp', matching the source's own default."}, 'imageBase64': {'type': 'string', 'description': 'Base64-encoded source image bytes (not a file path or URL).'}, 'maxDimension': {'type': 'integer', 'default': 1600, 'maximum': 2000, 'minimum': 1, 'description': 'Longer-side cap in pixels before encoding, aspect preserved, never enlarged. Defaults to 1600, matching the source. Capped at 2000 here (vs 4000 for image_compress) because this tool runs the encode 14 times.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['format', 'original', 'working', 'points'], 'properties': {'format': {'enum': ['jpeg', 'webp', 'avif'], 'type': 'string', 'description': 'Format every point was encoded in.'}, 'points': {'type': 'array', 'items': {'type': 'object', 'required': ['quality', 'bytes', 'percentChange'], 'properties': {'bytes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Encoded size at that quality, in bytes.'}, 'quality': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'The quality level sampled.'}, 'percentChange': {'type': 'number', 'description': 'Size against the original as a percentage; negative means smaller.'}}, 'additionalProperties': False}, 'description': "The 14 fixed sample points, ascending by quality. The 'knee' -- where size stops dropping much per quality point -- is what this tool exists to locate. No image bytes are returned."}, 'working': {'type': 'object', 'required': ['width', 'height', 'maxDimension'], 'properties': {'width': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Width the curve was measured at, in px.'}, 'height': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Height the curve was measured at, in px.'}, 'maxDimension': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'The longest-side cap that was applied before sampling.'}}, 'description': 'The downscaled image every quality level was encoded from. The knee sits in the same place at either size, so this does not distort the curve.', 'additionalProperties': False}, 'original': {'type': 'object', 'required': ['width', 'height', 'bytes'], 'properties': {'bytes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Original file size in bytes.'}, 'width': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Original width in px.'}, 'height': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Original height in px.'}}, 'description': 'The image as supplied.', 'additionalProperties': False}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['base64'], 'properties': {'base64': {'type': 'string', 'minLength': 1, 'description': 'Base64-encoded raw bytes of the .mobileprovision or .provisionprofile file.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ok', 'name', 'appIdName', 'applicationIdentifier', 'teamName', 'teamIdentifier', 'uuid', 'platform', 'createdDate', 'expirationDate', 'timeToLiveDays', 'expiry', 'profileType', 'certificateCount', 'deviceCount', 'devices', 'entitlements', 'rawPlistXml'], 'properties': {'ok': {'type': 'boolean', 'const': True, 'description': 'Always true on a readable profile. An unreadable file, a file with no embedded plist, or a plist that will not parse comes back as an error result instead, with the reason as its text.'}, 'name': {'type': ['string', 'null'], 'description': "The profile's name, or null if the plist omits it."}, 'uuid': {'type': ['string', 'null'], 'description': "The profile's UUID."}, 'expiry': {'type': 'object', 'required': ['status', 'daysRemaining', 'message'], 'properties': {'status': {'enum': ['valid', 'expiring_soon', 'expired', 'unknown'], 'type': 'string', 'description': "Expiry verdict; 'expiring_soon' means 30 days or fewer remain, 'unknown' means the profile carried no readable expiry date."}, 'message': {'type': 'string', 'description': 'That verdict written out with the date. An empty string when status is unknown.'}, 'daysRemaining': {'type': ['number', 'null'], 'description': 'Days until expiry, negative once expired. Null when status is unknown.'}}, 'description': 'Whether this profile still works, which is the question most callers are actually asking.', 'additionalProperties': False}, 'devices': {'type': 'array', 'items': {}, 'description': 'The registered device UDIDs, normally strings. Empty when the profile registers none.'}, 'platform': {'description': "Platforms the profile covers, normally an array such as ['ios']. Null when absent."}, 'teamName': {'type': ['string', 'null'], 'description': 'Developer team name.'}, 'appIdName': {'type': ['string', 'null'], 'description': 'The App ID name registered with the profile.'}, 'createdDate': {'type': ['string', 'null'], 'description': 'Creation date as an ISO 8601 string, or null when absent or unparseable.'}, 'deviceCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Number of registered device UDIDs; 0 for an App Store or enterprise profile.'}, 'profileType': {'type': 'object', 'required': ['kind', 'description'], 'properties': {'kind': {'enum': ['development', 'enterprise', 'app_store'], 'type': 'string', 'description': 'Profile kind, inferred from the registered-device list and the ProvisionsAllDevices flag -- not from a field that states it, because none does.'}, 'description': {'type': 'string', 'description': 'What that kind means for installing the build.'}}, 'description': 'Development/ad hoc vs. enterprise vs. App Store distribution.', 'additionalProperties': False}, 'rawPlistXml': {'type': 'string', 'description': 'The embedded property list as raw XML, for anything this report does not surface.'}, 'entitlements': {'type': 'object', 'description': 'The full entitlements dictionary verbatim from the profile, keys and values as the plist held them.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'expirationDate': {'type': ['string', 'null'], 'description': 'Expiry date as an ISO 8601 string, or null when absent or unparseable.'}, 'teamIdentifier': {'description': 'Team identifiers from the plist, normally an array of one team ID string. Null when absent.'}, 'timeToLiveDays': {'type': ['number', 'null'], 'description': "The profile's TimeToLive in days, or null when absent."}, 'certificateCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many signing certificates are embedded. The certificates themselves are not decoded -- only counted.'}, 'applicationIdentifier': {'type': ['string', 'null'], 'description': 'The application-identifier entitlement, i.e. team ID plus bundle ID -- the field that says what this profile actually signs.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'c': {'type': 'number', 'description': "OKLCH chroma. sRGB's most saturated colour reaches about 0.31; the source page's own slider goes to 0.4 so out-of-gamut requests are possible on purpose. Used (with l and h) only when color is omitted."}, 'h': {'type': 'number', 'description': 'OKLCH hue in degrees, 0-360. Used (with l and c) only when color is omitted.'}, 'l': {'type': 'number', 'description': 'OKLCH lightness, 0 (black) to 1 (white). Used (with c and h) only when color is omitted.'}, 'color': {'type': 'string', 'maxLength': 128, 'description': "CSS color to convert from â\x80\x94 hex ('#5b8cff' or '#58f'), rgb()/rgba(), hsl()/hsla(), or oklch(). Takes precedence over l/c/h when both are supplied."}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['requested', 'oklchText', 'inGamut', 'mapped', 'hex', 'rgb', 'rgbText', 'hsl', 'hslText'], 'properties': {'hex': {'type': 'string', 'description': 'The sRGB result as a hex string.'}, 'hsl': {'type': 'object', 'required': ['h', 's', 'l'], 'properties': {'h': {'type': 'number', 'description': 'Hue in degrees.'}, 'l': {'type': 'number', 'description': 'Lightness as a percentage. Note this is HSL lightness, which is not OKLCH lightness.'}, 's': {'type': 'number', 'description': 'Saturation as a percentage.'}}, 'description': 'The same colour in HSL, for code that still expects it.', 'additionalProperties': False}, 'rgb': {'type': 'object', 'required': ['r', 'g', 'b'], 'properties': {'b': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Blue channel, 0-255.'}, 'g': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Green channel, 0-255.'}, 'r': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Red channel, 0-255.'}}, 'description': 'The same colour as 8-bit sRGB channels.', 'additionalProperties': False}, 'mapped': {'type': 'boolean', 'description': 'True when the colour was gamut-mapped to fit sRGB, meaning hex below is a near miss rather than the exact request.'}, 'hslText': {'type': 'string', 'description': 'The colour as a CSS hsl() declaration.'}, 'inGamut': {'type': 'boolean', 'description': 'Whether the requested colour exists in sRGB.'}, 'rgbText': {'type': 'string', 'description': 'The colour as a CSS rgb() declaration.'}, 'oklchText': {'type': 'string', 'description': 'The colour as a CSS oklch() declaration.'}, 'requested': {'type': 'object', 'required': ['l', 'c', 'h'], 'properties': {'c': {'type': 'number', 'description': 'Requested chroma.'}, 'h': {'type': 'number', 'description': 'Requested hue angle in degrees.'}, 'l': {'type': 'number', 'description': 'Requested lightness, 0-1.'}}, 'description': 'The OKLCH coordinates that were asked for, before any gamut mapping -- keep these to see how far the sRGB answer had to move.', 'additionalProperties': False}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'c': {'type': 'number', 'description': "OKLCH chroma. sRGB's most saturated colour reaches about 0.31; the source page's own slider goes to 0.4 so out-of-gamut requests are possible on purpose. Used (with l and h) only when color is omitted."}, 'h': {'type': 'number', 'description': 'OKLCH hue in degrees, 0-360. Used (with l and c) only when color is omitted.'}, 'l': {'type': 'number', 'description': 'OKLCH lightness, 0 (black) to 1 (white). Used (with c and h) only when color is omitted.'}, 'mode': {'enum': ['hue', 'light', 'chroma'], 'type': 'string', 'default': 'hue', 'description': "Which channel the ramp sweeps while holding the other two fixed: 'hue' rotates hue around the wheel, 'light' sweeps lightness from a near-black floor to a near-white ceiling, 'chroma' sweeps chroma from 0 up to the base colour's own chroma."}, 'name': {'type': 'string', 'default': 'brand', 'maxLength': 64, 'description': "Stem for the generated CSS custom properties (e.g. 'brand' produces --brand-1, --brand-2, ...); sanitized to [a-z0-9-] the same way the source page does."}, 'color': {'type': 'string', 'maxLength': 128, 'description': "CSS color to convert from â\x80\x94 hex ('#5b8cff' or '#58f'), rgb()/rgba(), hsl()/hsla(), or oklch(). Takes precedence over l/c/h when both are supplied."}, 'steps': {'type': 'integer', 'default': 9, 'maximum': 24, 'minimum': 3, 'description': 'Number of swatches in the ramp, 3-24.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['base', 'mode', 'steps', 'css'], 'properties': {'css': {'type': 'string', 'description': 'The whole ramp as CSS custom properties, ready to paste into a stylesheet.'}, 'base': {'type': 'object', 'required': ['l', 'c', 'h'], 'properties': {'c': {'type': 'number', 'description': 'Base chroma.'}, 'h': {'type': 'number', 'description': 'Base hue angle in degrees.'}, 'l': {'type': 'number', 'description': 'Base lightness, 0-1.'}}, 'description': 'The OKLCH coordinates the ramp was generated from.', 'additionalProperties': False}, 'mode': {'enum': ['hue', 'light', 'chroma'], 'type': 'string', 'description': 'Which coordinate was varied across the steps, echoed from the input.'}, 'steps': {'type': 'array', 'items': {'type': 'object', 'required': ['index', 'oklch', 'oklchText', 'hex', 'mapped'], 'properties': {'hex': {'type': 'string', 'description': 'This step as an sRGB hex string.'}, 'index': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': '0-based position in the ramp.'}, 'oklch': {'type': 'object', 'required': ['l', 'c', 'h'], 'properties': {'c': {'type': 'number', 'description': 'Chroma at this step.'}, 'h': {'type': 'number', 'description': 'Hue at this step.'}, 'l': {'type': 'number', 'description': 'Lightness at this step.'}}, 'description': "This step's OKLCH coordinates.", 'additionalProperties': False}, 'mapped': {'type': 'boolean', 'description': 'True when this particular step fell outside sRGB and was gamut-mapped.'}, 'oklchText': {'type': 'string', 'description': 'This step as a CSS oklch() declaration.'}}, 'additionalProperties': False}, 'description': 'The ramp in order. Because each step is mapped independently, some can be mapped and others not.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['plants'], 'properties': {'light': {'enum': ['bright', 'indirect', 'low'], 'type': 'string', 'default': 'indirect', 'description': 'Light level: bright direct sun dries soil fastest, low light slowest. Defaults to bright-but-indirect.'}, 'plants': {'type': 'array', 'items': {'enum': ['snake', 'zz', 'aloe', 'jade', 'echeveria', 'cactus', 'hawortia', 'ponytail', 'rubber', 'monstera', 'pothos', 'philodendron', 'fiddle', 'dracaena', 'yucca', 'schefflera', 'spider', 'peaceLily', 'anthurium', 'orchid', 'birdOfPara', 'parlour', 'kentia', 'areca', 'chinese', 'prayer', 'calathea', 'fern', 'maidenhair', 'fittonia', 'begonia', 'africanViolet'], 'type': 'string'}, 'maxItems': 32, 'minItems': 1, 'description': 'Houseplant ids to include (each event uses this exact catalog, no free text). Duplicates are ignored. Ids: snake, zz, aloe, jade, echeveria, cactus, hawortia, ponytail, rubber, monstera, pothos, philodendron, fiddle, dracaena, yucca, schefflera, spider, peaceLily, anthurium, orchid, birdOfPara, parlour, kentia, areca, chinese, prayer, calathea, fern, maidenhair, fittonia, begonia, africanViolet.'}, 'season': {'enum': ['spring', 'summer', 'autumn', 'winter'], 'type': 'string', 'description': "Current season, which scales every interval (summer fastest, winter roughly 60% slower). If omitted, defaults from today's calendar month assuming the *northern* hemisphere, exactly like the source page -- pass this explicitly for a southern-hemisphere season or to plan for a season other than the current one."}, 'potSize': {'enum': ['small', 'medium', 'large'], 'type': 'string', 'default': 'medium', 'description': 'Pot diameter band: small (under 12cm), medium (12-25cm, default), large (over 25cm). A larger pot holds more soil and dries more slowly.'}, 'startDate': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "First reminder date, YYYY-MM-DD. Every plant's recurring event starts on this same date, each with its own repeat interval. Defaults to today."}, 'potMaterial': {'enum': ['terracotta', 'plastic', 'glazed'], 'type': 'string', 'default': 'plastic', 'description': 'Unglazed terracotta breathes and dries noticeably faster than plastic (default) or glazed ceramic.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['schedule', 'summary', 'calendar', 'note'], 'properties': {'note': {'type': 'string', 'description': 'Standing caution that these intervals are a starting point to adjust against the actual soil.'}, 'summary': {'type': 'object', 'required': ['chosenCount', 'minIntervalDays', 'maxIntervalDays', 'seasonFactor'], 'properties': {'chosenCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many plants were scheduled.'}, 'seasonFactor': {'type': 'number', 'description': 'The season multiplier applied to every plant.'}, 'maxIntervalDays': {'type': 'number', 'description': 'The longest interval in the set.'}, 'minIntervalDays': {'type': 'number', 'description': "The thirstiest plant's interval -- the cadence that actually governs a shared watering round."}}, 'description': 'The set at a glance, for deciding a single watering day.', 'additionalProperties': False}, 'calendar': {'type': 'object', 'required': ['filename', 'mimeType', 'icsText'], 'properties': {'icsText': {'type': 'string', 'description': 'A complete iCalendar document with a repeating event per plant, ready to write to a file and import.'}, 'filename': {'type': 'string', 'description': 'Suggested filename for the calendar file.'}, 'mimeType': {'type': 'string', 'description': 'MIME type of icsText, i.e. text/calendar.'}}, 'description': 'The schedule as a subscribable calendar. Returned inline as text, not as a file download.', 'additionalProperties': False}, 'schedule': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'name', 'intervalDays', 'baseDays', 'multiplier'], 'properties': {'key': {'type': 'string', 'description': 'Stable identifier for the plant, as given in the input.'}, 'name': {'type': 'string', 'description': "The plant's common name."}, 'baseDays': {'type': 'number', 'description': "The plant's baseline interval before pot, light and season adjustments."}, 'multiplier': {'type': 'number', 'description': 'The combined adjustment applied to baseDays, so the difference is auditable rather than magic.'}, 'intervalDays': {'type': 'number', 'description': 'Days between waterings after every adjustment -- the number to act on.'}}, 'additionalProperties': False}, 'description': 'One entry per requested plant, in catalogue order.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['sex', 'age', 'currentWeight', 'goalWeight', 'activityLevel', 'dailyDeficitKcal'], 'properties': {'age': {'type': 'number', 'maximum': 120, 'minimum': 18, 'description': 'Age in years, 18-120. The source page is not validated for children; 18+ only.'}, 'sex': {'enum': ['male', 'female'], 'type': 'string', 'description': 'Biological sex, used by the Mifflin-St Jeor formula.'}, 'units': {'enum': ['metric', 'imperial'], 'type': 'string', 'default': 'metric', 'description': 'metric = cm/kg, imperial = ft+in/lb. Applies to height and both weight fields.'}, 'heightCm': {'type': 'number', 'maximum': 300, 'description': "Height in centimeters. Required when units is 'metric'.", 'exclusiveMinimum': 0}, 'heightFt': {'type': 'number', 'maximum': 9, 'minimum': 0, 'description': "Feet part of height. Required when units is 'imperial'."}, 'heightIn': {'type': 'number', 'maximum': 11, 'minimum': 0, 'description': "Inches part of height (0-11). Required when units is 'imperial'."}, 'goalWeight': {'type': 'number', 'maximum': 1500, 'description': 'Goal body weight, same unit as currentWeight. Must be less than currentWeight -- this tool only projects weight loss, matching the source page.', 'exclusiveMinimum': 0}, 'activityLevel': {'enum': ['sedentary', 'light', 'moderate', 'very_active', 'extra_active'], 'type': 'string', 'description': "Activity multiplier bucket, the site's five options: sedentary x1.2 (desk job, no exercise), light x1.375 (1-3 sessions/week), moderate x1.55 (3-5 sessions/week, the site default), very_active x1.725 (6-7 sessions/week), extra_active x1.9 (physical job or 2x/day training)."}, 'currentWeight': {'type': 'number', 'maximum': 1500, 'description': 'Current body weight, kg if units is metric, lb if imperial.', 'exclusiveMinimum': 0}, 'referenceDate': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'ISO date (YYYY-MM-DD) the projection counts forward from. Defaults to today (UTC) when omitted.'}, 'dailyDeficitKcal': {'type': 'number', 'maximum': 10000, 'description': "Daily calorie deficit to hold against today's computed maintenance. The site's quick picks are 250/500/750/1000 kcal, but any positive number is accepted.", 'exclusiveMinimum': 0}, 'includeChartSeries': {'type': 'boolean', 'default': True, 'description': 'If true, also return the weekly weight series and the naive straight-line end week -- the same two lines the source page charts. Set false to skip them for a lighter response.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['currentWeightKg', 'goalWeightKg', 'activityMultiplier', 'maintenanceKcal', 'intakeKcal', 'floorKcal', 'status', 'settleWeightKg', 'plateau', 'reachedWithinHorizon', 'horizonDays', 'naiveDays', 'naiveWeeks', 'daysToGoal', 'weeksToGoal', 'gapDays', 'projectedDate', 'note', 'series', 'naiveLineEndWeek'], 'properties': {'note': {'type': 'string', 'description': 'Plain-language reading of the result, including why the two answers differ or why the goal is unreachable.'}, 'series': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'required': ['weekIndex', 'weightKg'], 'properties': {'weightKg': {'type': 'number', 'description': 'Projected weight at that week under the adaptive model.'}, 'weekIndex': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Weeks from the reference date.'}}, 'additionalProperties': False}}, {'type': 'null'}], 'description': 'Weekly projection points for plotting. Null when includeChartSeries was false.'}, 'status': {'type': 'string', 'description': 'How the projection ended: the goal is reached, or it settles short of the goal, or it is unreachable at this intake. The field to branch on before reading the dates.'}, 'gapDays': {'type': ['number', 'null'], 'description': 'How many days longer the honest answer is than the naive one -- the whole point of the tool. Null when the goal is never reached.'}, 'plateau': {'type': ['boolean', 'null'], 'description': 'True when the settle weight is above the goal, i.e. this deficit alone will never get there. Null when it does not apply.'}, 'floorKcal': {'type': 'number', 'description': 'The intake floor that was enforced, below which the projection is not modelled.'}, 'naiveDays': {'type': ['number', 'null'], 'description': 'Days predicted by the flat 7,700 kcal-per-kg rule that ignores the falling maintenance -- the figure most calculators stop at.'}, 'daysToGoal': {'type': ['number', 'null'], 'description': 'Days to the goal under the adaptive model, or null when the goal is never reached.'}, 'intakeKcal': {'type': 'number', 'description': 'Daily intake implied by the requested deficit, after the safety floor is applied.'}, 'naiveWeeks': {'type': ['number', 'null'], 'description': 'The same figure in whole weeks.'}, 'horizonDays': {'type': ['number', 'null'], 'description': 'Length of the modelled horizon in days, or null when not modelled.'}, 'weeksToGoal': {'type': ['number', 'null'], 'description': 'The same figure in whole weeks.'}, 'goalWeightKg': {'type': 'number', 'description': 'Target weight in kg, after any imperial conversion.'}, 'projectedDate': {'type': ['string', 'null'], 'description': 'Calendar date the goal is reached, ISO YYYY-MM-DD, or null when it is not reached.'}, 'settleWeightKg': {'type': ['number', 'null'], 'description': 'The weight this intake eventually settles at, since maintenance falls as weight does. Null when it does not apply.'}, 'currentWeightKg': {'type': 'number', 'description': 'Starting weight in kg, after any imperial conversion.'}, 'maintenanceKcal': {'type': 'number', 'description': 'Maintenance calories at the starting weight.'}, 'naiveLineEndWeek': {'type': ['number', 'null'], 'description': 'Where the naive straight line would end on the same axes, so the two can be drawn together. Null when there is no series.'}, 'activityMultiplier': {'type': 'number', 'description': 'The multiplier the chosen activity level maps to.'}, 'reachedWithinHorizon': {'type': 'boolean', 'description': 'Whether the goal is reached inside the modelled horizon.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ingredient', 'amount', 'unit'], 'properties': {'unit': {'enum': ['cup', 'tbsp', 'tsp', 'ml', 'g', 'oz'], 'type': 'string', 'description': 'Unit the amount is given in.'}, 'amount': {'type': 'string', 'maxLength': 64, 'minLength': 1, 'description': 'Amount as a decimal ("1.5"), a simple fraction ("3/4"), or a mixed number ("1 1/2").'}, 'variant': {'type': 'string', 'maxLength': 64, 'description': 'Measurement style for ingredients that have more than one USDA figure (e.g. sugar-brown: "packed"/"loose"; sugar-icing: "unsifted"/"sifted"; almonds: "whole"/"sliced"/"slivered"/"ground"). Omit for ingredients with only one style.'}, 'cupSizeMl': {'type': 'number', 'default': 236.588, 'description': "Cup size in ml, for the 'cup' unit (and 'tbsp'/'tsp' on ingredients without their own USDA spoon weight). Defaults to the US customary cup (236.588 ml); other common values are 240 (US nutrition-label cup) or 250 (metric cup). Does not affect the reported density, which is always derived from the customary cup regardless of this value, matching the source tool.", 'exclusiveMinimum': 0}, 'ingredient': {'enum': ['flour-ap', 'flour-bread', 'flour-cake', 'flour-ww', 'cornstarch', 'sugar-white', 'sugar-brown', 'sugar-icing', 'cocoa', 'butter', 'oil-olive', 'oil-canola', 'milk', 'buttermilk', 'cream', 'sourcream', 'creamcheese', 'yogurt', 'water', 'egg', 'honey', 'maple', 'molasses', 'peanutbutter', 'salt', 'bakingpowder', 'bakingsoda', 'yeast', 'oats', 'rice', 'almonds', 'walnuts', 'pecans', 'raisins', 'chocchips', 'parmesan'], 'type': 'string', 'description': 'Which ingredient to convert, identified by its GO AI recipe-tool id (e.g. "flour-ap", "sugar-brown", "honey").'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['grams', 'gramsRounded', 'ounces', 'ouncesRounded', 'densityGPerMl', 'densityGPerMlRounded', 'workSentence', 'waterComparison'], 'properties': {'grams': {'type': 'number', 'description': 'The converted weight in grams, unrounded.'}, 'ounces': {'type': 'number', 'description': 'The converted weight in ounces, unrounded.'}, 'gramsRounded': {'type': 'number', 'description': 'The same weight rounded the way a kitchen scale reads it -- the number to actually use.'}, 'workSentence': {'type': 'string', 'description': 'The conversion written out as an equation, so the caller can check the cup size and density rather than trusting a bare number.'}, 'densityGPerMl': {'type': 'number', 'description': 'The density used for this ingredient, in grams per millilitre.'}, 'ouncesRounded': {'type': 'number', 'description': 'The same weight in ounces, rounded for practical use.'}, 'waterComparison': {'type': 'string', 'description': 'How this ingredient compares in weight to the same volume of water -- the intuition that explains why a cup of flour and a cup of honey are nothing alike.'}, 'densityGPerMlRounded': {'type': 'number', 'description': 'That density rounded for display.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['lines'], 'properties': {'lines': {'type': 'array', 'items': {'type': 'string', 'maxLength': 1000}, 'maxItems': 500, 'description': 'One ingredient per array entry, as free text (e.g. "2 cups all-purpose flour", "1/2 tsp table salt"), up to 500 lines of 1000 characters each. Lines with no parseable leading amount, or with an amount but no recognisable unit/ingredient after it, are returned unchanged.'}, 'cupSizeMl': {'type': 'number', 'default': 236.588, 'description': 'Cup size in ml used when converting a scaled "cup"/"tbsp"/"tsp" amount to grams. Defaults to the US customary cup (236.588 ml); other common values are 240 or 250.', 'exclusiveMinimum': 0}, 'toServings': {'type': 'number', 'default': 1, 'description': "Servings wanted. 0 (or an omitted field) falls back to 1, matching the source tool's own guard."}, 'fromServings': {'type': 'number', 'default': 1, 'description': "Servings the recipe as written makes. 0 (or an omitted field) falls back to 1, matching the source tool's own guard."}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['lines'], 'properties': {'lines': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The ingredient lines rescaled, one output line per input line and in the same order. A line whose quantity could not be parsed is returned unchanged rather than dropped, so the list stays aligned with the recipe it came from.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['task'], 'properties': {'task': {'enum': ['write', 'copy', 'edit', 'longdoc', 'code', 'review', 'math', 'news', 'research', 'translate', 'brainstorm', 'voice', 'prose', 'longinput', 'image', 'video', 'bulk'], 'type': 'string', 'description': "The kind of task, one of: write (Long or structured writing), copy (Punchy copy, hooks, social), edit (Editing my own draft), longdoc (Summarising long documents), code (Writing code), review (Reviewing code someone else wrote), math (Maths and calculations), news (Current events, what's trending), research (Research and synthesis), translate (Translation), brainstorm (Brainstorming ideas), voice (Talking out loud), prose (Prose you'll publish as-is), longinput (Very long inputs on a budget), image (Generating images), video (Generating video), bulk (Running the same prompt hundreds of times)."}, 'priority': {'enum': ['quality', 'cost', 'fresh'], 'type': 'string', 'default': 'quality', 'description': '"quality" (default) returns the task\'s default best-result pick. "cost" swaps to DeepSeek when this task supports a cheaper substitute. "fresh" swaps to Grok when this task supports a fresher/more current substitute. Has no effect for tasks that don\'t offer that tradeoff.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['modelKey', 'model', 'tag', 'taskLabel', 'why', 'backup', 'adjusted', 'note', 'disclaimer'], 'properties': {'tag': {'type': 'string', 'description': 'Short label for why this model wins the task, e.g. its standout strength.'}, 'why': {'type': 'string', 'description': 'The reasoning behind the recommendation.'}, 'note': {'type': ['string', 'null'], 'description': 'What that adjustment was, when adjusted is true; otherwise null.'}, 'model': {'type': 'string', 'description': "The recommended model's display name."}, 'backup': {'type': 'string', 'description': 'A second choice worth trying if the first does not suit.'}, 'adjusted': {'type': 'boolean', 'description': 'True when the stated priority (cost or freshness) moved the answer away from the quality-first pick.'}, 'modelKey': {'type': 'string', 'description': 'Stable identifier for the recommended model, safe to switch on.'}, 'taskLabel': {'type': 'string', 'description': 'Human-readable name of the task that was matched.'}, 'disclaimer': {'type': 'string', 'description': 'Standing note that this is a fixed editorial table, not a live benchmark.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['pages'], 'properties': {'size': {'enum': ['6.9', '6.7', '6.5', '13ipad', 'all'], 'type': 'string', 'default': '6.9', 'description': 'Which official App Store Connect size to export: 6.9"/6.7"/6.5" iPhone or 13" iPad, or "all" for every size (returned as a ZIP). "all" renders 4 canvases per page, so it is limited to 2 pages per call; for a longer set, make one call per size â\x80\x94 a single-size call carries all 10.'}, 'pages': {'type': 'array', 'items': {'anyOf': [{'type': 'object', 'properties': {'device': {'type': 'object', 'properties': {'dx': {'type': 'number', 'default': 0, 'maximum': 1, 'minimum': -1, 'description': 'Horizontal offset from the device band centre, as a fraction of the canvas width. Positive = right. Limited to +/-1.'}, 'dy': {'type': 'number', 'default': 0, 'maximum': 1, 'minimum': -1, 'description': 'Vertical offset from the device band centre, as a fraction of the canvas height. Positive = down. Limited to +/-1.'}, 'scale': {'type': 'number', 'default': 1, 'maximum': 1.5, 'minimum': 0.05, 'description': 'Device size multiplier; 1 = the default size that fits the band. Limited to 0.05-1.5.'}, 'rotationDeg': {'type': 'number', 'default': 0, 'maximum': 90, 'minimum': -90, 'description': 'Device rotation in degrees, +/-90.'}}, 'description': 'Position/size/rotation of the device frame on this page. Only meaningful when imageBase64 is present.'}, 'imageBase64': {'type': 'string', 'description': 'Base64 screenshot bytes for this page: at most 6 megapixels (13" iPad native, 2064x2752, is 5.68 MP), and at most 4 MB of decoded bytes SUMMED over every page in the call (the whole JSON body is capped at 6 MB). For a multi-page set send JPEG, not PNG â\x80\x94 quality 80 is typically a quarter the size and indistinguishable once scaled into a device frame. Omit for a blank page (title card / outro / continuation of a device from the previous page).'}}}, {'type': 'null'}]}, 'maxItems': 10, 'minItems': 1, 'description': 'One entry per exported page/PNG, in order. Use null for a blank page. At most 10 pages at any single size; size:"all" renders every page 4 times over and fits 2. Over that, the call is refused before any rendering.'}, 'texts': {'type': 'array', 'items': {'type': 'object', 'required': ['page', 'text'], 'properties': {'dx': {'type': 'number', 'default': 0, 'maximum': 1, 'minimum': -1, 'description': 'Horizontal offset from the page centre, as a fraction of canvas width. Limited to +/-1.'}, 'dy': {'type': 'number', 'default': 0, 'maximum': 1, 'minimum': -1, 'description': 'Vertical offset from the default first-baseline position, as a fraction of canvas height. Limited to +/-1.'}, 'page': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0, 'description': '0-based index into `pages` this text is anchored to.'}, 'text': {'type': 'string', 'maxLength': 512, 'description': 'The text content, at most 512 characters. "\\n" forces a line break; otherwise it wraps to fit `width`.'}, 'color': {'type': 'string', 'default': '#f7f7f5', 'maxLength': 512, 'description': 'CSS hex color.'}, 'width': {'type': 'number', 'default': 0.84, 'maximum': 1, 'description': 'Wrap width as a fraction of canvas width.', 'exclusiveMinimum': 0}, 'autoFit': {'type': 'boolean', 'default': True, 'description': 'Shrink-to-fit within its fitGroup so the text never exceeds 3 lines or the wrap width.'}, 'fitGroup': {'type': 'string', 'maxLength': 64, 'description': 'Texts sharing a fitGroup id are auto-fit together at one common size (e.g. the same headline repeated across every page). Omit for an independently-sized text.'}, 'fontFamily': {'enum': ['Urbanist', 'Inter', 'Poppins', 'Montserrat', 'Manrope', 'Rubik', 'Nunito', 'Fredoka', 'Space Grotesk', 'Oswald', 'Bebas Neue', 'Anton', 'Archivo Black', 'Playfair Display', 'DM Serif Display', 'Merriweather', 'Lora', 'Georgia', 'JetBrains Mono', 'Courier', 'Caveat', 'Pacifico'], 'type': 'string', 'default': 'Urbanist'}, 'rotationDeg': {'type': 'number', 'default': 0, 'maximum': 180, 'minimum': -180, 'description': "Rotation in degrees about the centre of the first line's baseline."}, 'fontSizeScale': {'type': 'number', 'default': 1, 'maximum': 4, 'description': 'Multiplier on the auto-fit size; ignored while autoFit is true.', 'exclusiveMinimum': 0}}}, 'default': [], 'maxItems': 40, 'description': 'Zero or more text layers, at most 40. Order is z-order (later entries draw on top); each is confined to one page.'}, 'joinedScene': {'type': 'boolean', 'default': False, 'description': 'When true and there is more than one page, one gradient stretches across the whole set instead of repeating per page.'}, 'backgroundTo': {'type': 'string', 'default': '#2b2140', 'maxLength': 512, 'description': 'Gradient end color (bottom-right), hex.'}, 'backgroundFrom': {'type': 'string', 'default': '#12121a', 'maxLength': 512, 'description': 'Gradient start color (top-left), hex.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['sizesRendered'], 'properties': {'sizesRendered': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'label', 'width', 'height', 'pageCount'], 'properties': {'key': {'type': 'string', 'description': 'Identifier for the device size, matching the size input.'}, 'label': {'type': 'string', 'description': 'Human-readable device name for this size.'}, 'width': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Canvas width in px, i.e. the exact pixel size App Store Connect expects.'}, 'height': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Canvas height in px.'}, 'pageCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many pages were rendered at this size.'}}, 'additionalProperties': False}, 'description': 'One entry per rendered device size. The images themselves come back as separate content blocks -- a single render inline, a multi-page or multi-size batch as a ZIP behind a resource_link.'}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['images'], 'properties': {'fit': {'enum': ['contain', 'cover', 'stretch'], 'type': 'string', 'default': 'contain', 'description': "How each image fills its target box. 'contain' keeps the whole picture and pads the gap with paddingColor. 'cover' fills the box and crops whatever hangs over. 'stretch' distorts the image to the exact box, ignoring aspect ratio."}, 'images': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'imageBase64'], 'properties': {'name': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'Original filename (extension optional); used to derive each output filename.'}, 'imageBase64': {'type': 'string', 'minLength': 1, 'description': 'Base64-encoded source image bytes (any format sharp can decode: PNG, JPEG, WebP, GIF, AVIF, TIFF, ...).'}}}, 'maxItems': 60, 'minItems': 1, 'description': 'One to 60 images. Each is resized independently to every size in the chosen preset. A call is additionally capped at 48000000 total output pixels across images x sizes, so a preset with large or numerous sizes admits fewer images than one with small ones.'}, 'preset': {'enum': ['appstore69', 'appstore67', 'appstoreIpad', 'androidIcon', 'favicon', 'og', 'xcard', 'linkedin', 'igSquare', 'igPortrait', 'igStory', 'youtube', 'custom'], 'type': 'string', 'default': 'og', 'description': 'Which size(s) to produce for every image. appstore69: App Store screenshot, 6.9" iPhone, 1320x2868. appstore67: App Store screenshot, 6.7" iPhone, 1290x2796. appstoreIpad: App Store screenshot, 13" iPad, 2064x2752. androidIcon: Android launcher icon, 5 densities (48/72/96/144/192px, each output foldered as mipmap-mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi). favicon: favicon set, 16/32/48/180/192/512px. og: Open Graph card, 1200x630. xcard: X (Twitter) summary card, 1200x628. linkedin: LinkedIn share image, 1200x627. igSquare: Instagram square post, 1080x1080. igPortrait: Instagram portrait post, 1080x1350. igStory: Instagram story, 1080x1920. youtube: YouTube thumbnail, 1280x720. custom: a single arbitrary size taken from customWidth/customHeight.'}, 'customWidth': {'type': 'integer', 'default': 1200, 'maximum': 8000, 'minimum': 1, 'description': 'Target width in px. Only used when preset is "custom".'}, 'customHeight': {'type': 'integer', 'default': 630, 'maximum': 8000, 'minimum': 1, 'description': 'Target height in px. Only used when preset is "custom".'}, 'paddingColor': {'type': 'string', 'default': '#ffffff', 'maxLength': 512, 'minLength': 1, 'description': 'Hex color (e.g. "#ffffff") used to pad the frame when fit is "contain". Ignored for "cover" and "stretch".'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['imagesIn', 'filesOut', 'sizes', 'preset', 'fit', 'paddingColor', 'outputs'], 'properties': {'fit': {'enum': ['contain', 'cover', 'stretch'], 'type': 'string', 'description': 'How each image was fitted to its target box.'}, 'sizes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many target sizes the chosen preset expands to.'}, 'preset': {'type': 'string', 'description': 'The preset that was applied, echoed from the input.'}, 'outputs': {'type': 'array', 'items': {'type': 'object', 'required': ['source', 'file', 'width', 'height', 'bytes'], 'properties': {'file': {'type': 'string', 'description': 'Path of the file inside the ZIP.'}, 'bytes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Output size in bytes.'}, 'width': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Output width in px.'}, 'height': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Output height in px.'}, 'source': {'type': 'string', 'description': 'Which input image this file came from.'}}, 'additionalProperties': False}, 'description': 'Every produced file, so the archive can be checked without unzipping it.'}, 'filesOut': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many files were produced, i.e. imagesIn x sizes.'}, 'imagesIn': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many source images were supplied.'}, 'paddingColor': {'type': ['string', 'null'], 'description': "The letterbox colour, which only applies to fit 'contain'. Null for 'cover' and 'stretch', where nothing is padded."}}, 'additionalProperties': False}
Esquema de entrada
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['image_base64'], 'properties': {'filename': {'type': 'string', 'maxLength': 255, 'description': 'Original filename, used only to name the returned cleaned file (defaults to "image"). Format detection is by content signature, not by this name or extension.'}, 'image_base64': {'type': 'string', 'minLength': 1, 'description': 'Base64-encoded bytes of the JPEG or PNG file to inspect.'}, 'include_cleaned_image': {'type': 'boolean', 'default': True, 'description': 'When true (default), also return the metadata-stripped image bytes alongside the report. Set to false to get only the report.'}}}
Esquema de salida
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['recognized', 'format', 'metadataFound', 'fieldsFound', 'fields', 'make', 'model', 'gps', 'rotationWarning', 'removedSegments', 'removedSegmentCount', 'originalSizeBytes', 'cleanedSizeBytes', 'removedBytes', 'verified', 'verifiedBytes', 'cleanedImageIncluded', 'message'], 'properties': {'gps': {'anyOf': [{'type': 'object', 'required': ['latitude', 'longitude', 'altitudeMeters', 'dateStamp'], 'properties': {'latitude': {'type': 'number', 'description': 'Latitude in decimal degrees, to 6 places.'}, 'dateStamp': {'type': ['string', 'null'], 'description': 'GPS date stamp, when recorded.'}, 'longitude': {'type': 'number', 'description': 'Longitude in decimal degrees, to 6 places.'}, 'altitudeMeters': {'type': ['number', 'null'], 'description': 'Altitude in metres, when recorded.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Embedded location, or null when the file carried none. The single most sensitive thing in a photo, so it is surfaced on its own rather than only inside fields.'}, 'make': {'type': ['string', 'null'], 'description': 'Camera make, when EXIF carried one.'}, 'model': {'type': ['string', 'null'], 'description': 'Camera model, when EXIF carried one.'}, 'fields': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'value'], 'properties': {'field': {'type': 'string', 'description': 'Human-readable field name, e.g. Camera make, Latitude, XMP block.'}, 'value': {'type': 'string', 'description': 'The value as found, stringified.'}}, 'additionalProperties': False}, 'description': 'Every metadata field read from the file -- this is the disclosure the caller is usually checking for.'}, 'format': {'enum': ['jpeg', 'png'], 'type': 'string', 'description': 'Which of the two supported formats the file was read as.'}, 'message': {'type': 'string', 'description': 'Plain-language summary, including why no cleaned file was returned when that is the case.'}, 'verified': {'type': ['boolean', 'null'], 'description': 'Result of the byte-for-byte check that the retained image data is unchanged. Null when no cleaning was attempted; false means the check failed and no cleaned file was returned.'}, 'recognized': {'type': 'boolean', 'const': True, 'description': 'Always true here. A file that is neither a JPEG nor a PNG comes back as an error result instead, not as recognized:false.'}, 'fieldsFound': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'How many individual metadata fields were read out.'}, 'removedBytes': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Bytes saved by stripping, or null when no cleaned image was produced.'}, 'metadataFound': {'type': 'boolean', 'description': 'Whether any strippable metadata was present at all.'}, 'verifiedBytes': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'How many bytes that check compared. Null when no cleaning was attempted.'}, 'removedSegments': {'type': 'array', 'items': {'type': 'object', 'required': ['label', 'sizeBytes'], 'properties': {'label': {'type': 'string', 'description': 'Which segment or chunk was removed, e.g. EXIF, XMP, a PNG tEXt chunk.'}, 'sizeBytes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Its size in bytes.'}}, 'additionalProperties': False}, 'description': 'Each metadata segment or chunk that was stripped, with its size.'}, 'rotationWarning': {'type': 'boolean', 'description': 'True when an EXIF Orientation tag was removed, which can make the cleaned image appear rotated in viewers that relied on it.'}, 'cleanedSizeBytes': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Size of the cleaned file, or null when no cleaned image was produced.'}, 'originalSizeBytes': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Size of the supplied file in bytes.'}, 'removedSegmentCount': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Number of segments/chunks removed.'}, 'cleanedImageIncluded': {'type': 'boolean', 'description': 'Whether a cleaned file accompanies this report as a content block. False when include_cleaned_image was off, when there was nothing to strip, or when verification failed.'}}, 'additionalProperties': False}
Cambios recientes en herramientas
Servidores MCP similares
GripForge
Generates, rigs, animates, analyzes, and packages game characters, weapons, armor, effects, environments, and engine-ready assets.
spriteship
Generates and manages 2D game characters, assets, animations, tilesets, UI packs, maps, and engine-ready exports for multiple gam…
Blixtworks
Offers pay-per-call utilities for text, image processing and analysis, data conversion, validation, web inspection, cryptography,…
Compose Preview Catalogs
Browses, renders, compares, audits, and edits Jetpack Compose preview catalogs and associated UI designs.
arch-tools-mcp
Provides general-purpose agent APIs for browser automation, web and PDF extraction, data conversion, email operations, fact check…
kernelcad
Authors, evaluates, reviews, simulates, edits, and exports parametric CAD assemblies and geometry from editable TypeScript-based …
floot
Creates, edits, previews, databases, and publishes full-stack web and mobile applications with hosted resources and deployment wo…
Raven
Supports coding agents with design audits, design-system guidance, and a configurable visual preference profile.