@cloudinary/asset-management-mcp 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/mcp-server.js +66 -26
- package/bin/mcp-server.js.map +10 -10
- package/esm/funcs/searchSearchAssets.d.ts +46 -2
- package/esm/funcs/searchSearchAssets.d.ts.map +1 -1
- package/esm/funcs/searchSearchAssets.js +46 -2
- package/esm/funcs/searchSearchAssets.js.map +1 -1
- package/esm/landing-page.js +1 -1
- package/esm/lib/config.d.ts +3 -3
- package/esm/lib/config.js +3 -3
- package/esm/mcp-server/mcp-server.js +1 -1
- package/esm/mcp-server/server.js +1 -1
- package/esm/mcp-server/tools/searchSearchAssets.d.ts.map +1 -1
- package/esm/mcp-server/tools/searchSearchAssets.js +46 -2
- package/esm/mcp-server/tools/searchSearchAssets.js.map +1 -1
- package/esm/models/searchparameters.d.ts +4 -1
- package/esm/models/searchparameters.d.ts.map +1 -1
- package/esm/models/searchparameters.js +9 -8
- package/esm/models/searchparameters.js.map +1 -1
- package/esm/tool-names.js +1 -1
- package/esm/tool-names.js.map +1 -1
- package/package.json +1 -1
- package/src/funcs/searchSearchAssets.ts +46 -2
- package/src/landing-page.ts +1 -1
- package/src/lib/config.ts +3 -3
- package/src/mcp-server/mcp-server.ts +1 -1
- package/src/mcp-server/server.ts +1 -1
- package/src/mcp-server/tools/searchSearchAssets.ts +46 -2
- package/src/models/searchparameters.ts +25 -9
- package/src/tool-names.ts +1 -1
package/README.md
CHANGED
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
<details>
|
|
31
31
|
<summary>Claude Desktop</summary>
|
|
32
32
|
|
|
33
|
-
Install the MCP server as a Desktop Extension using the pre-built [`mcp-server.mcpb`](https://github.com/cloudinary/asset-management-mcp/releases/download/v0.9.
|
|
33
|
+
Install the MCP server as a Desktop Extension using the pre-built [`mcp-server.mcpb`](https://github.com/cloudinary/asset-management-mcp/releases/download/v0.9.1/mcp-server.mcpb) file:
|
|
34
34
|
|
|
35
|
-
Simply drag and drop the [`mcp-server.mcpb`](https://github.com/cloudinary/asset-management-mcp/releases/download/v0.9.
|
|
35
|
+
Simply drag and drop the [`mcp-server.mcpb`](https://github.com/cloudinary/asset-management-mcp/releases/download/v0.9.1/mcp-server.mcpb) file onto Claude Desktop to install the extension.
|
|
36
36
|
|
|
37
37
|
The MCP bundle package includes the MCP server and all necessary configuration. Once installed, the server will be available without additional setup.
|
|
38
38
|
|
package/bin/mcp-server.js
CHANGED
|
@@ -13959,10 +13959,10 @@ var init_config = __esm(() => {
|
|
|
13959
13959
|
]).describe("Regional endpoint selection");
|
|
13960
13960
|
SDK_METADATA = {
|
|
13961
13961
|
language: "typescript",
|
|
13962
|
-
openapiDocVersion: "0.5.
|
|
13963
|
-
sdkVersion: "0.9.
|
|
13962
|
+
openapiDocVersion: "0.5.1",
|
|
13963
|
+
sdkVersion: "0.9.1",
|
|
13964
13964
|
genVersion: "2.881.4",
|
|
13965
|
-
userAgent: "speakeasy-sdk/mcp-typescript 0.9.
|
|
13965
|
+
userAgent: "speakeasy-sdk/mcp-typescript 0.9.1 2.881.4 0.5.1 @cloudinary/asset-management-mcp"
|
|
13966
13966
|
};
|
|
13967
13967
|
});
|
|
13968
13968
|
|
|
@@ -73360,11 +73360,12 @@ var init_searchparameters = __esm(() => {
|
|
|
73360
73360
|
"duration"
|
|
73361
73361
|
]);
|
|
73362
73362
|
SearchParametersRange$zodSchema = object({
|
|
73363
|
-
from: number2().optional().describe("Start of the range (inclusive)"),
|
|
73364
|
-
|
|
73363
|
+
from: number2().optional().describe("Start of the range (inclusive). At least one of `from` / `to` is required."),
|
|
73364
|
+
key: string2().describe("A label for the bucket, returned in the aggregation response. 1–20 chars, alphanumeric plus `-` and `_`."),
|
|
73365
|
+
to: number2().optional().describe("End of the range (exclusive). At least one of `from` / `to` is required.")
|
|
73365
73366
|
});
|
|
73366
73367
|
Aggregate$zodSchema = object({
|
|
73367
|
-
ranges: array(lazy(() => SearchParametersRange$zodSchema)),
|
|
73368
|
+
ranges: array(lazy(() => SearchParametersRange$zodSchema)).describe("One or more ranges for the numeric field. Each range must include a `key` label and at least one of `from` / `to`.\n"),
|
|
73368
73369
|
type: Type$zodSchema
|
|
73369
73370
|
});
|
|
73370
73371
|
AggregateEnum$zodSchema = _enum2([
|
|
@@ -73375,7 +73376,8 @@ var init_searchparameters = __esm(() => {
|
|
|
73375
73376
|
AggregateUnion$zodSchema = union([
|
|
73376
73377
|
array(AggregateEnum$zodSchema),
|
|
73377
73378
|
array(lazy(() => Aggregate$zodSchema))
|
|
73378
|
-
]).describe(
|
|
73379
|
+
]).describe(`Fields or ranges to aggregate search results by. Requires a Tier 2 search plan; on Tier 1 the field is accepted but aggregations are omitted from the response.
|
|
73380
|
+
`);
|
|
73379
73381
|
WithField$zodSchema = _enum2([
|
|
73380
73382
|
"context",
|
|
73381
73383
|
"tags",
|
|
@@ -73389,19 +73391,20 @@ var init_searchparameters = __esm(() => {
|
|
|
73389
73391
|
aggregate: union([
|
|
73390
73392
|
array(AggregateEnum$zodSchema),
|
|
73391
73393
|
array(lazy(() => Aggregate$zodSchema))
|
|
73392
|
-
]).optional().describe(
|
|
73393
|
-
|
|
73394
|
+
]).optional().describe(`Fields or ranges to aggregate search results by. Requires a Tier 2 search plan; on Tier 1 the field is accepted but aggregations are omitted from the response.
|
|
73395
|
+
`),
|
|
73396
|
+
expression: string2().optional().describe('The Lucene-like search expression. Supports token match (`:`), exact match (`=`), trailing `*` for prefix match, ranges (`[a TO b]`, `{a TO b}`), and comparisons (`>`, `<`, `>=`, `<=`). Combine terms with uppercase `AND`, `OR`, `NOT`, or `+`/`-`. `NOT` must appear between clauses — a leading `NOT` is a parse error; use `-field:value` to negate the first clause. Group with parentheses.\n\nWrap values containing spaces, colons, or other reserved characters (`! ( ) { } [ ] ^ ~ ? \\ = & < > |`) in double quotes, e.g. `tags:"service:mantels"`, `aspect_ratio:"16:9"`. Send raw `<`/`>`, never HTML-escaped.\n\nWildcards are prefix-only (trailing `*`). A bare `*` (e.g. `folder:*`, `context.alt:*`, `metadata.key:*`, `tags:*`, `-tags:*`) is a parse error — there is no "has any value" / presence probe. Either drop the clause, use a concrete prefix, or filter on a known token.\n\nDates: ISO-8601 in quotes, or relative shorthand `1h`, `1d`, `1w`, `1m`, `1y` (`uploaded_at>1d`, `created_at:[4w TO 1w]`).\n\nSupported fields: `public_id`, `asset_id`, `filename`, `display_name`, `folder` / `asset_folder` (singular, not `folders`), `tags`, `context.<key>`, `metadata.<external_id>`, `resource_type`, `type`, `format`, `bytes`, `width`, `height`, `duration`, `pages`, `aspect_ratio`, `transparent`, `grayscale`, `status`, `moderation_status`, `moderation_kind`, `uploaded_at`, `created_at`, `taken_at`, `updated_at`, `last_updated.<kind>`, `face_count`, `illustration_score`, `quality_score`. Fields under `image_metadata.*`, `image_analysis.*`, `quality_analysis.*`, and `accessibility_analysis.*` also require the matching `with_field` to be returned in the response.\n\nSee the [search expressions guide](https://cloudinary.com/documentation/search_expressions.md) for the full reference.\n'),
|
|
73394
73397
|
fields: string2().optional().describe(`A comma-separated list of fields to include in the response.
|
|
73395
73398
|
Notes:
|
|
73396
73399
|
- This parameter takes precedence over the with_field parameter, so if you want any additional asset attributes returned, make sure to also include them in this list (e.g., tags or context).
|
|
73397
73400
|
- The following fields are always included in the response: public_id, asset_id, asset_folder, created_at, status, type, and resource_type.
|
|
73398
73401
|
`),
|
|
73399
|
-
max_results: int().optional().describe("The maximum number of results to return. Default - 50. Maximum - 500
|
|
73402
|
+
max_results: int().optional().describe("The maximum number of results to return. Default - 50. Maximum - 500.\nSet to `0` to get only `total_count` and `aggregations` without any resources in the response — useful for counting or aggregation-only queries.\n"),
|
|
73400
73403
|
next_cursor: string2().optional().describe("The cursor value to get the next page of results. Available when a previous search returned more results than max_results."),
|
|
73401
73404
|
sort_by: array(record(string2(), DirectionEnum$zodSchema)).optional().describe(`An array of single-key objects mapping a field to a sort direction. Each object must contain exactly one field name mapped to 'asc' or 'desc'.
|
|
73402
73405
|
Default: [{"created_at": "desc"}].
|
|
73403
73406
|
`),
|
|
73404
|
-
with_field: array(WithField$zodSchema).optional().describe("The additional
|
|
73407
|
+
with_field: array(WithField$zodSchema).optional().describe("The additional asset attributes to include in each search result. The `fields` parameter takes precedence over this parameter. `image_metadata`, `image_analysis`, and `metadata` require a Tier 2 search plan.\n")
|
|
73405
73408
|
}).describe("Common parameters for resource search operations.");
|
|
73406
73409
|
});
|
|
73407
73410
|
|
|
@@ -73499,9 +73502,53 @@ var init_searchSearchAssets2 = __esm(() => {
|
|
|
73499
73502
|
|
|
73500
73503
|
Returns a list of resources matching the specified search criteria.
|
|
73501
73504
|
|
|
73502
|
-
Uses Lucene-like query language to
|
|
73503
|
-
|
|
73504
|
-
|
|
73505
|
+
Uses a Lucene-like query language to filter assets by descriptive attributes (\`public_id\`, \`asset_id\`, \`filename\`, \`display_name\`, \`folder\` / \`asset_folder\`, \`tags\`, \`context.<key>\`), file details (\`resource_type\`, \`type\`, \`format\`, \`bytes\`, \`width\`, \`height\`, \`duration\`, \`pages\`, \`aspect_ratio\`, \`transparent\`, \`grayscale\`), lifecycle dates (\`uploaded_at\`, \`created_at\`, \`taken_at\`, \`updated_at\`, \`last_updated.<kind>\`), moderation and lifecycle state (\`status\`, \`moderation_status\`, \`moderation_kind\`), embedded data (\`image_metadata.*\`), structured metadata (\`metadata.<external_id>\`), and analysis fields (\`face_count\`, \`colors\`, \`quality_score\`, \`illustration_score\`, \`accessibility_analysis.*\`). Supports sorting, aggregate counts, and complex boolean expressions. See the \`expression\` parameter for the full field reference.
|
|
73506
|
+
|
|
73507
|
+
## Expression syntax
|
|
73508
|
+
|
|
73509
|
+
- **Match**: \`field:value\` (token match) or \`field=value\` (exact match). Examples: \`tags:shirt\`, \`tags=cotton\`.
|
|
73510
|
+
- **Comparisons**: \`>\`, \`<\`, \`>=\`, \`<=\` for numbers and dates. Example: \`bytes>10000000\`.
|
|
73511
|
+
- **Ranges**: \`field:[from TO to]\` inclusive, \`field:{from TO to}\` exclusive. Example: \`width:{200 TO 1028}\`.
|
|
73512
|
+
- **Booleans**: \`AND\`, \`OR\`, \`NOT\` (uppercase), or \`+\` (must), \`-\` (must not). \`NOT\` must appear between clauses — a bare leading \`NOT\` is a parse error; use \`-field:value\` to negate the first clause. Group with parentheses: \`(shirt OR pants) AND clothes\`.
|
|
73513
|
+
- **Wildcards**: trailing \`*\` only, for prefix match (\`public_id:shoes_*\`, \`format:jp*\`, \`tags:shirt*\`). Not supported on \`folder\`, \`asset_folder\`, \`resource_type\`, or \`type\`. Leading \`*\`, middle \`*\`, \`?\`, and bare \`*\` (\`folder:*\`, \`context.alt:*\`) are all parse errors — wildcards cannot be used as a "field is present" probe.
|
|
73514
|
+
- **Tokenized vs exact fields**: \`tags\`, \`filename\`, \`display_name\`, \`context.<key>\`, and \`metadata.<id>\` match on tokens split by whitespace and punctuation — \`tags:analysis\` matches the tag \`full-analysis\`. \`public_id\`, \`folder\`, \`asset_folder\`, and \`format\` match the whole value — \`public_id:dog\` will not match \`dog_pldcwy\`; use \`public_id="dog_pldcwy"\` (exact) or \`public_id:dog*\` (prefix). These exact-match fields still accept a trailing \`*\` for prefix match (except \`folder\` / \`asset_folder\`, where wildcards are ignored).
|
|
73515
|
+
- **Dates**: ISO-8601 in quotes (\`uploaded_at>"2024-01-15"\`) or relative shorthand \`Nh\`, \`Nd\`, \`Nw\`, \`Nm\`, \`Ny\` (\`uploaded_at>1d\`, \`created_at:[4w TO 1w]\`). Send raw \`<\`/\`>\`, never HTML-escaped.
|
|
73516
|
+
- **Quoting**: wrap any value containing a space, colon, or other reserved character (\`! ( ) { } [ ] ^ ~ ? \\ = & < > |\`) in double quotes, or escape each character with \`\\\`. Examples: \`tags:"service:mantels"\`, \`aspect_ratio:"16:9"\`, \`folder:"My Folder"\`.
|
|
73517
|
+
|
|
73518
|
+
## Common mistakes
|
|
73519
|
+
|
|
73520
|
+
- Use \`folder:\` or \`asset_folder:\` (singular); \`folders:\`, \`asset_folder_id:\`, and other invented variants are not valid fields. Pass the exact folder name — wildcards do not apply here.
|
|
73521
|
+
- There is no "has any value" / presence probe. \`folder:*\`, \`metadata.alt:*\`, \`context.key:*\`, \`tags:*\`, and \`-tags:*\` are all parse errors. See *"Which assets have any value for \`metadata.<id>\`?"* under **Common tasks** for workarounds.
|
|
73522
|
+
- \`NOT foo AND bar\` is a parse error. Write it as \`bar AND NOT foo\` or \`-foo AND bar\`, and keep every \`NOT\` between two clauses (\`a AND NOT b AND NOT c\` is fine; \`NOT b AND NOT c …\` is not).
|
|
73523
|
+
- \`public_id:dog\` will not match \`dog_pldcwy\`. Use \`public_id="dog_pldcwy"\` (exact) or \`public_id:dog*\` (prefix).
|
|
73524
|
+
- \`tags=service:mantels\` fails because the unquoted colon is parsed as a field separator. Use \`tags="service:mantels"\` or \`tags=service\\:mantels\`.
|
|
73525
|
+
- Do not HTML-escape operators. Send \`uploaded_at<1h\`, not \`uploaded_at<1h\`.
|
|
73526
|
+
- Do not leave an operand empty (e.g. \`tags: AND -tags:foo\`). Omit the empty clause entirely.
|
|
73527
|
+
|
|
73528
|
+
## Tips
|
|
73529
|
+
|
|
73530
|
+
- Set \`max_results: 0\` to return only \`total_count\` and \`aggregations\` without any resource payload — useful for counts and aggregation-only queries.
|
|
73531
|
+
- \`total_count\` is always present in the response; prefer it over running an aggregation just to get a count.
|
|
73532
|
+
- \`aggregate\` (both simple and range variants) and the \`metadata\`, \`image_metadata\`, \`image_analysis\` values of \`with_field\` require a Tier 2 search plan.
|
|
73533
|
+
- Range aggregations require each range to include a \`key\` label (1–20 chars, \`[a-zA-Z0-9_-]+\`) and at least one of \`from\` / \`to\`.
|
|
73534
|
+
|
|
73535
|
+
## Common tasks
|
|
73536
|
+
|
|
73537
|
+
- **Count matching assets** — put the filter in \`expression\` with \`max_results: 0\` and read \`total_count\` from the response. Works on every tier; no \`aggregate\` needed.
|
|
73538
|
+
- **Preview one matching asset** — set \`max_results: 1\`; add \`with_field: ["tags", "context"]\` (or \`metadata\`, Tier 2) to inspect values. Prefer this over fetching and scanning a full page.
|
|
73539
|
+
- **Distribution of values for a field** — Tier 2: \`aggregate: [format|resource_type|type]\` for enum counts, or range aggregations on \`bytes\`, \`image_pixels\`, \`video_pixels\`, or \`duration\`. Tier 1 fallback: run N small queries with \`max_results: 0\`, one per candidate value, and read \`total_count\` from each.
|
|
73540
|
+
- **"Which assets have any value for \`metadata.<id>\`?"** — not expressible directly (\`metadata.X:*\` is a parse error; there is no presence probe). Workarounds: (a) if the field has a known value set, enumerate — \`metadata.region:(apac OR emea OR amer)\`; (b) query broadly with \`with_field: ["metadata"]\` (Tier 2) and filter client-side for entries where the field is set; (c) at ingest time, attach a sentinel tag whenever the field is set, then search by that tag.
|
|
73541
|
+
- **Newest / largest N** — keep the filter in \`expression\` and sort explicitly: \`sort_by: [{uploaded_at: "desc"}]\` with \`max_results: 10\`.
|
|
73542
|
+
- **Filter by folder** — both \`asset_folder:"parent/child"\` and \`folder:"parent/child"\` match an exact folder path; there is no wildcard or "contains". To query across multiple folders, enumerate: \`asset_folder:("campaigns/2024" OR "campaigns/2025")\`.
|
|
73543
|
+
- **Filter by metadata when you only know the label** — first call \`list-metadata-fields\` to resolve the label to an \`external_id\`, then query \`metadata.<external_id>:value\`.
|
|
73544
|
+
- **Multiple independent filters in one turn** — prefer one \`expression\` with \`OR\` / parentheses over firing many parallel calls: \`metadata.region:apac OR metadata.region:emea\` in a single request is faster and more reliable than two parallel requests.
|
|
73545
|
+
|
|
73546
|
+
## Examples
|
|
73547
|
+
|
|
73548
|
+
- \`tags:shirt AND uploaded_at>1d\`
|
|
73549
|
+
- \`resource_type:image AND bytes>1000000 AND (format:png OR format:jpg)\`
|
|
73550
|
+
- \`folder:products AND context.category:electronics\`
|
|
73551
|
+
- \`tags:"service:mantels" AND -tags:discontinued\`
|
|
73505
73552
|
`,
|
|
73506
73553
|
scopes: ["librarian"],
|
|
73507
73554
|
annotations: {
|
|
@@ -74056,7 +74103,7 @@ A report on the status of product environment usage, including storage, credits,
|
|
|
74056
74103
|
function createMCPServer(deps) {
|
|
74057
74104
|
const server = new McpServer({
|
|
74058
74105
|
name: "CloudinaryAssetMgmt",
|
|
74059
|
-
version: "0.9.
|
|
74106
|
+
version: "0.9.1"
|
|
74060
74107
|
});
|
|
74061
74108
|
const getClient = deps.getSDK || (() => new CloudinaryAssetMgmtCore({
|
|
74062
74109
|
security: deps.security,
|
|
@@ -74273,14 +74320,7 @@ Lists the folders that match the specified search expression. Limited to 2000 re
|
|
|
74273
74320
|
},
|
|
74274
74321
|
{
|
|
74275
74322
|
name: "search-assets",
|
|
74276
|
-
description:
|
|
74277
|
-
|
|
74278
|
-
Returns a list of resources matching the specified search criteria.
|
|
74279
|
-
|
|
74280
|
-
Uses Lucene-like query language to search by descriptive attributes (public_id, filename, folder, tags, context), file details (resource_type, format, bytes, width, height), embedded data (image_metadata), and analyzed data (face_count, colors, quality_score). Supports aggregate counts and complex Boolean expressions.
|
|
74281
|
-
|
|
74282
|
-
Examples: tags:shirt AND uploaded_at>1d, resource_type:image AND bytes>1mb, folder:products OR context.category:electronics
|
|
74283
|
-
`
|
|
74323
|
+
description: "Provides a powerful query interface to filter and retrieve assets and their details\n\nReturns a list of resources matching the specified search criteria.\n\nUses a Lucene-like query language to filter assets by descriptive attributes (`public_id`, `asset_id`, `filename`, `display_name`, `folder` / `asset_folder`, `tags`, `context.<key>`), file details (`resource_type`, `type`, `format`, `bytes`, `width`, `height`, `duration`, `pages`, `aspect_ratio`, `transparent`, `grayscale`), lifecycle dates (`uploaded_at`, `created_at`, `taken_at`, `updated_at`, `last_updated.<kind>`), moderation and lifecycle state (`status`, `moderation_status`, `moderation_kind`), embedded data (`image_metadata.*`), structured metadata (`metadata.<external_id>`), and analysis fields (`face_count`, `colors`, `quality_score`, `illustration_score`, `accessibility_analysis.*`). Supports sorting, aggregate counts, and complex boolean expressions. See the `expression` parameter for the full field reference.\n\n## Expression syntax\n\n- **Match**: `field:value` (token match) or `field=value` (exact match). Examples: `tags:shirt`, `tags=cotton`.\n- **Comparisons**: `>`, `<`, `>=`, `<=` for numbers and dates. Example: `bytes>10000000`.\n- **Ranges**: `field:[from TO to]` inclusive, `field:{from TO to}` exclusive. Example: `width:{200 TO 1028}`.\n- **Booleans**: `AND`, `OR`, `NOT` (uppercase), or `+` (must), `-` (must not). `NOT` must appear between clauses — a bare leading `NOT` is a parse error; use `-field:value` to negate the first clause. Group with parentheses: `(shirt OR pants) AND clothes`.\n- **Wildcards**: trailing `*` only, for prefix match (`public_id:shoes_*`, `format:jp*`, `tags:shirt*`). Not supported on `folder`, `asset_folder`, `resource_type`, or `type`. Leading `*`, middle `*`, `?`, and bare `*` (`folder:*`, `context.alt:*`) are all parse errors — wildcards cannot be used as a \"field is present\" probe.\n- **Tokenized vs exact fields**: `tags`, `filename`, `display_name`, `context.<key>`, and `metadata.<id>` match on tokens split by whitespace and punctuation — `tags:analysis` matches the tag `full-analysis`. `public_id`, `folder`, `asset_folder`, and `format` match the whole value — `public_id:dog` will not match `dog_pldcwy`; use `public_id=\"dog_pldcwy\"` (exact) or `public_id:dog*` (prefix). These exact-match fields still accept a trailing `*` for prefix match (except `folder` / `asset_folder`, where wildcards are ignored).\n- **Dates**: ISO-8601 in quotes (`uploaded_at>\"2024-01-15\"`) or relative shorthand `Nh`, `Nd`, `Nw`, `Nm`, `Ny` (`uploaded_at>1d`, `created_at:[4w TO 1w]`). Send raw `<`/`>`, never HTML-escaped.\n- **Quoting**: wrap any value containing a space, colon, or other reserved character (`! ( ) { } [ ] ^ ~ ? \\ = & < > |`) in double quotes, or escape each character with `\\`. Examples: `tags:\"service:mantels\"`, `aspect_ratio:\"16:9\"`, `folder:\"My Folder\"`.\n\n## Common mistakes\n\n- Use `folder:` or `asset_folder:` (singular); `folders:`, `asset_folder_id:`, and other invented variants are not valid fields. Pass the exact folder name — wildcards do not apply here.\n- There is no \"has any value\" / presence probe. `folder:*`, `metadata.alt:*`, `context.key:*`, `tags:*`, and `-tags:*` are all parse errors. See *\"Which assets have any value for `metadata.<id>`?\"* under **Common tasks** for workarounds.\n- `NOT foo AND bar` is a parse error. Write it as `bar AND NOT foo` or `-foo AND bar`, and keep every `NOT` between two clauses (`a AND NOT b AND NOT c` is fine; `NOT b AND NOT c …` is not).\n- `public_id:dog` will not match `dog_pldcwy`. Use `public_id=\"dog_pldcwy\"` (exact) or `public_id:dog*` (prefix).\n- `tags=service:mantels` fails because the unquoted colon is parsed as a field separator. Use `tags=\"service:mantels\"` or `tags=service\\:mantels`.\n- Do not HTML-escape operators. Send `uploaded_at<1h`, not `uploaded_at<1h`.\n- Do not leave an operand empty (e.g. `tags: AND -tags:foo`). Omit the empty clause entirely.\n\n## Tips\n\n- Set `max_results: 0` to return only `total_count` and `aggregations` without any resource payload — useful for counts and aggregation-only queries.\n- `total_count` is always present in the response; prefer it over running an aggregation just to get a count.\n- `aggregate` (both simple and range variants) and the `metadata`, `image_metadata`, `image_analysis` values of `with_field` require a Tier 2 search plan.\n- Range aggregations require each range to include a `key` label (1–20 chars, `[a-zA-Z0-9_-]+`) and at least one of `from` / `to`.\n\n## Common tasks\n\n- **Count matching assets** — put the filter in `expression` with `max_results: 0` and read `total_count` from the response. Works on every tier; no `aggregate` needed.\n- **Preview one matching asset** — set `max_results: 1`; add `with_field: [\"tags\", \"context\"]` (or `metadata`, Tier 2) to inspect values. Prefer this over fetching and scanning a full page.\n- **Distribution of values for a field** — Tier 2: `aggregate: [format|resource_type|type]` for enum counts, or range aggregations on `bytes`, `image_pixels`, `video_pixels`, or `duration`. Tier 1 fallback: run N small queries with `max_results: 0`, one per candidate value, and read `total_count` from each.\n- **\"Which assets have any value for `metadata.<id>`?\"** — not expressible directly (`metadata.X:*` is a parse error; there is no presence probe). Workarounds: (a) if the field has a known value set, enumerate — `metadata.region:(apac OR emea OR amer)`; (b) query broadly with `with_field: [\"metadata\"]` (Tier 2) and filter client-side for entries where the field is set; (c) at ingest time, attach a sentinel tag whenever the field is set, then search by that tag.\n- **Newest / largest N** — keep the filter in `expression` and sort explicitly: `sort_by: [{uploaded_at: \"desc\"}]` with `max_results: 10`.\n- **Filter by folder** — both `asset_folder:\"parent/child\"` and `folder:\"parent/child\"` match an exact folder path; there is no wildcard or \"contains\". To query across multiple folders, enumerate: `asset_folder:(\"campaigns/2024\" OR \"campaigns/2025\")`.\n- **Filter by metadata when you only know the label** — first call `list-metadata-fields` to resolve the label to an `external_id`, then query `metadata.<external_id>:value`.\n- **Multiple independent filters in one turn** — prefer one `expression` with `OR` / parentheses over firing many parallel calls: `metadata.region:apac OR metadata.region:emea` in a single request is faster and more reliable than two parallel requests.\n\n## Examples\n\n- `tags:shirt AND uploaded_at>1d`\n- `resource_type:image AND bytes>1000000 AND (format:png OR format:jpg)`\n- `folder:products AND context.category:electronics`\n- `tags:\"service:mantels\" AND -tags:discontinued`\n"
|
|
74284
74324
|
},
|
|
74285
74325
|
{
|
|
74286
74326
|
name: "visual-search-assets",
|
|
@@ -75240,7 +75280,7 @@ http_headers = { "api-key" = "YOUR_API_KEY", "api-secret" = "YOUR_API_SECRET", "
|
|
|
75240
75280
|
<h1>Instructions</h1>
|
|
75241
75281
|
<p>One-click installation for Claude Desktop users</p>
|
|
75242
75282
|
<div class="instruction-item">
|
|
75243
|
-
<a href="https://github.com/cloudinary/asset-management-mcp/releases/download/v0.9.
|
|
75283
|
+
<a href="https://github.com/cloudinary/asset-management-mcp/releases/download/v0.9.1/mcp-server.mcpb" download="mcp-server.mcpb" class="action-button header-action" style="display: inline-flex; margin-bottom: 16px;">
|
|
75244
75284
|
\uD83D\uDCE5 Download MCP Bundle
|
|
75245
75285
|
</a>
|
|
75246
75286
|
</div>
|
|
@@ -77184,7 +77224,7 @@ var routes = ln({
|
|
|
77184
77224
|
var app = _e(routes, {
|
|
77185
77225
|
name: "mcp",
|
|
77186
77226
|
versionInfo: {
|
|
77187
|
-
currentVersion: "0.9.
|
|
77227
|
+
currentVersion: "0.9.1"
|
|
77188
77228
|
}
|
|
77189
77229
|
});
|
|
77190
77230
|
Yt(app, process4.argv.slice(2), buildContext(process4));
|
|
@@ -77192,5 +77232,5 @@ export {
|
|
|
77192
77232
|
app
|
|
77193
77233
|
};
|
|
77194
77234
|
|
|
77195
|
-
//# debugId=
|
|
77235
|
+
//# debugId=92BB3EDCF4CED14664756E2164756E21
|
|
77196
77236
|
//# sourceMappingURL=mcp-server.js.map
|