Skip to main content
Glama

metadata

Destructive

Workspace metadata: the field VOCABULARY (fields-list), lexical value search (search), metadata+content matching (compound-search), extraction eligibility (eligible), and folding near-duplicate field names together (fields-merge, DESTRUCTIVE). RETIRED: metadata TEMPLATES and SAVED VIEWS are gone — the platform removed those endpoints, so template-, nodes-, auto-match, preview-match, suggest-fields, extract-all and view-*/views-list no longer exist here. Per-file extraction lives on the storage tool (metadata-extract for one file, metadata-extract-all for a folder subtree).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
qNosearch keyword(s). 1-1024 chars. Multi-token = ALL tokens (AND); case-insensitive; substring for <=64 chars, else whole-word.
limitNosearch: page size (1-100, default 100).
actionYesOperation. Use 'describe' for full action reference.
cursorNoeligible/fields-list: opaque pagination cursor from a prior page's response — echo it back verbatim rather than constructing one. Omit for the first page.
offsetNosearch: results to skip (default 0). offset+limit must stay <= 10000.
confirmNofields-merge: must be 'true' to proceed. The merge is IRREVERSIBLE and workspace-wide; the gate exists because the platform's guards check DATA safety, not whether the two fields mean the same thing.
page_sizeNoeligible/fields-list: cursor page size (1-250, default 100). Server caps at 250.
template_idNoRETIRED — metadata templates were removed, so there is no template to scope to. This tool REFUSES it on EVERY action: supplying it FAILS the request rather than narrowing it (the platform hard-refuses it too, and OPTIONS deliberately does not advertise it). Narrow by FIELD NAME instead — list valid names with `metadata action=fields-list`.
source_fieldNofields-merge: the field NAME that is FOLDED AWAY and stops existing. Names, not ids.
target_fieldNofields-merge: the field NAME that SURVIVES and absorbs the source's values.
workspace_idNoWorkspace opaque ID (19-digit numeric ID or custom name). Required for every action.
content_queryNocompound-search: free-text query run against INDEXED FILE CONTENT (1-1024 chars). Required for compound-search and AND-ed with metadata_filters — a file matches only if it satisfies BOTH. A file with no indexed content can never match, however well its metadata fits.
display_limitNosearch: how many items to return post-fetch. Default 10, max 100 (the backend fetches at most 100 per page — a higher value has no effect; use offset to page past 100).
describe_actionNoWhen action='describe', narrow the output to ONE action's full params/notes (e.g. 'fields-list'). Omit to get the compact action index.
metadata_filtersNocompound-search: JSON predicate array `[{"field","operator","value"}]` (sent to the platform as `filters`). Required for compound-search.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed25 schema fields changed
    • changedInput schema / properties / action / enum
      Previous value: -[
      -  "describe",
      -  "template-create",
      -  "template-list",
      -  "template-details",
      -  "template-update",
      -  "template-clone",
      -  "template-delete",
      -  "template-assign",
      -  "template-unassign",
      -  "template-resolve",
      -  "template-assignments",
      -  "preview-match",
      -  "suggest-fields",
      -  "eligible",
      -  "nodes-add",
      -  "nodes-remove",
      -  "nodes-list",
      -  "auto-match",
      -  "extract-all",
      -  "view-get",
      -  "view-save",
      -  "view-delete",
      -  "views-list",
      -  "view-export",
      -  "search"
      -]New value: +[
      +  "describe",
      +  "eligible",
      +  "fields-list",
      +  "search",
      +  "compound-search",
      +  "fields-merge"
      +]
    • removedInput schema / properties / batch_size
      Removed value: -{
      -  "description": "auto-match: optional batch-size override (clamped server-side). Omit for default.",
      -  "maximum": 9007199254740991,
      -  "minimum": 1,
      -  "type": "integer"
      -}
    • removedInput schema / properties / category
      Removed value: -{
      -  "description": "Metadata template category (accepted but ignored server-side — no effect).",
      -  "enum": [
      -    "legal",
      -    "financial",
      -    "business",
      -    "medical",
      -    "technical",
      -    "engineering",
      -    "insurance",
      -    "educational",
      -    "multimedia",
      -    "hr"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / config
      Removed value: -{
      -  "description": "view-save config JSON: `{version:1, columns:[{field,visible?,width?}], sort:{field,dir}, filters:[{field,operator,value_type,value}]}`. Max 5 filters AND-chained; operator in `= != < <= > >=`; value_type in `string|int|float|bool`.",
      -  "type": "string"
      -}
    • addedInput schema / properties / confirm
      Added value: +{
      +  "description": "fields-merge: must be 'true' to proceed. The merge is IRREVERSIBLE and workspace-wide; the gate exists because the platform's guards check DATA safety, not whether the two fields mean the same thing.",
      +  "enum": [
      +    "true",
      +    "false"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / content_query
      Added value: +{
      +  "description": "compound-search: free-text query run against INDEXED FILE CONTENT (1-1024 chars). Required for compound-search and AND-ed with metadata_filters — a file matches only if it satisfies BOTH. A file with no indexed content can never match, however well its metadata fits.",
      +  "maxLength": 1024,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / properties / cursor / description
      Previous value: -"eligible/nodes-list: opaque pagination cursor from a prior page's response. Omit for the first page."New value: +"eligible/fields-list: opaque pagination cursor from a prior page's response — echo it back verbatim rather than constructing one. Omit for the first page."
    • changedInput schema / properties / describe_action / description
      Previous value: -"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'template-list'). Omit to get the compact action index."New value: +"When action='describe', narrow the output to ONE action's full params/notes (e.g. 'fields-list'). Omit to get the compact action index."
    • removedInput schema / properties / description
      Removed value: -{
      -  "description": "Template description. ≤255 chars, empty allowed (template-create/-update/-clone). preview-match: required, 1-2000. suggest-fields: optional, ≤2000.",
      -  "maxLength": 2000,
      -  "type": "string"
      -}
    • removedInput schema / properties / extract_fields
      Removed value: -{
      -  "description": "extract-all: JSON array of field names to restrict the batch job to (e.g. `[\"vendor\",\"amount\"]`); omit for all fields.",
      -  "type": "string"
      -}
    • removedInput schema / properties / fields
      Removed value: -{
      -  "description": "JSON array of field defs (template-create/-update/-clone). At least one field must have autoextract:true (default) or API returns 1605. Each: {name, description, type (string|int|float|bool|json|url|datetime), min?, max?, default?, fixed_list?, can_be_null?, autoextract?}.",
      -  "type": "string"
      -}
    • removedInput schema / properties / filters
      Removed value: -{
      -  "description": "template-list filter (default 'all'): all|enabled|disabled|custom|system. (Replaces the old workspace `template_filter` param.)",
      -  "enum": [
      -    "all",
      -    "enabled",
      -    "disabled",
      -    "custom",
      -    "system"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / force
      Removed value: -{
      -  "description": "extract-all: when 'true', re-extract every mapped node even if it already has KV data (re-extract flow). Default 'false' skips nodes with values present.",
      -  "enum": [
      -    "true",
      -    "false"
      -  ],
      -  "type": "string"
      -}
    • addedInput schema / properties / metadata_filters
      Added value: +{
      +  "description": "compound-search: JSON predicate array `[{\"field\",\"operator\",\"value\"}]` (sent to the platform as `filters`). Required for compound-search. ",
      +  "type": "string"
      +}
    • removedInput schema / properties / name
      Removed value: -{
      -  "description": "Template name (1-255 chars: template-create/-update/-clone and preview-match), OR an optional saved-view label on view-save (≤30 chars; omit to keep the existing label).",
      -  "maxLength": 255,
      -  "minLength": 1,
      -  "type": "string"
      -}
    • removedInput schema / properties / node_id
      Removed value: -{
      -  "description": "Storage tree node opaque ID (used by template-resolve, and template-assign to scope an assignment).",
      -  "type": "string"
      -}
    • removedInput schema / properties / node_ids
      Removed value: -{
      -  "description": "JSON array of node IDs. suggest-fields: 1-25 file nodes. nodes-add/-remove: nodes to map/unmap (files+notes; folders/links rejected) — deduped first-seen, max 50 unique per call (the server hard-rejects >50 per request; the per-template TOTAL node cap is separate and enforced server-side).",
      -  "type": "string"
      -}
    • changedInput schema / properties / page_size / description
      Previous value: -"eligible/nodes-list: cursor page size (1-250, default 100). Server caps at 250."New value: +"eligible/fields-list: cursor page size (1-250, default 100). Server caps at 250."
    • removedInput schema / properties / parent_node_id
      Removed value: -{
      -  "description": "view-export destination folder opaque ID (must be a folder, not trashed). Omit for workspace root.",
      -  "maxLength": 64,
      -  "type": "string"
      -}
    • removedInput schema / properties / sort_dir
      Removed value: -{
      -  "description": "nodes-list: asc|desc (only with sort_field).",
      -  "enum": [
      -    "asc",
      -    "desc"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / sort_field
      Removed value: -{
      -  "description": "nodes-list: optional template field name to sort by.",
      -  "type": "string"
      -}
    • addedInput schema / properties / source_field
      Added value: +{
      +  "description": "fields-merge: the field NAME that is FOLDED AWAY and stops existing. Names, not ids.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / target_field
      Added value: +{
      +  "description": "fields-merge: the field NAME that SURVIVES and absorbs the source's values.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / properties / template_id / description
      Previous value: -"Metadata template ID (e.g. mt_abc123). For search, restricts to nodes with values from this template (custom fields excluded)."New value: +"RETIRED — metadata templates were removed, so there is no template to scope to. This tool REFUSES it on EVERY action: supplying it FAILS the request rather than narrowing it (the platform hard-refuses it too, and OPTIONS deliberately does not advertise it). Narrow by FIELD NAME instead — list valid names with `metadata action=fields-list`."
    • removedInput schema / properties / user_context
      Removed value: -{
      -  "description": "suggest-fields: short view/template hint (1-64 chars, letters/numbers/spaces). Example: \"photo collection\".",
      -  "maxLength": 64,
      -  "minLength": 1,
      -  "type": "string"
      -}
  2. Changed1 schema field changed
    • changedInput schema / properties / description / description
      Previous value: -"Template description. ≤1000 chars, empty allowed (template-create/-update/-clone). preview-match: required, 1-2000. suggest-fields: optional, ≤2000."New value: +"Template description. ≤255 chars, empty allowed (template-create/-update/-clone). preview-match: required, 1-2000. suggest-fields: optional, ≤2000."
  3. Changed5 schema fields changed
    • changedInput schema / properties / config / description
      Previous value: -"view-save config JSON: `{version:1, columns:[{field,visible?,width?}], sort:{field,dir}, filters:[{field,operator,value_type,value}]}`. Max 5 filters…"New value: +"view-save config JSON: `{version:1, columns:[{field,visible?,width?}], sort:{field,dir}, filters:[{field,operator,value_type,value}]}`. Max 5 filters AND-chained; operator in `= != < <= > >=`; value_type in `string|int|float|bool`."
    • changedInput schema / properties / display_limit / description
      Previous value: -"search: how many items to return post-fetch. Default 10, max 100 (the backend fetches at most 100 per page — a higher value has no effect; use offset to page…"New value: +"search: how many items to return post-fetch. Default 10, max 100 (the backend fetches at most 100 per page — a higher value has no effect; use offset to page past 100)."
    • changedInput schema / properties / fields / description
      Previous value: -"JSON array of field defs (template-create/-update/-clone). At least one field must have autoextract:true (default) or API returns 1605. Each: {name,…"New value: +"JSON array of field defs (template-create/-update/-clone). At least one field must have autoextract:true (default) or API returns 1605. Each: {name, description, type (string|int|float|bool|json|url|datetime), min?, max?, default?, fixed_list?, can_be_null?, autoextract?}."
    • changedInput schema / properties / name / description
      Previous value: -"Template name (1-255 chars: template-create/-update/-clone and preview-match), OR an optional saved-view label on view-save (≤30 chars; omit to keep the…"New value: +"Template name (1-255 chars: template-create/-update/-clone and preview-match), OR an optional saved-view label on view-save (≤30 chars; omit to keep the existing label)."
    • changedInput schema / properties / node_ids / description
      Previous value: -"JSON array of node IDs. suggest-fields: 1-25 file nodes. nodes-add/-remove: nodes to map/unmap (files+notes; folders/links rejected) — deduped first-seen, max…"New value: +"JSON array of node IDs. suggest-fields: 1-25 file nodes. nodes-add/-remove: nodes to map/unmap (files+notes; folders/links rejected) — deduped first-seen, max 50 unique per call (the server hard-rejects >50 per request; the per-template TOTAL node cap is separate and enforced server-side)."
  4. Changed1 schema field changed
    • changedInput schema / properties / name / description
      Previous value: -"Template name. 1-255 chars (template-create/-update/-clone and preview-match)."New value: +"Template name (1-255 chars: template-create/-update/-clone and preview-match), OR an optional saved-view label on view-save (≤30 chars; omit to keep the…"
  5. Added

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description flags fields-merge as DESTRUCTIVE and clarifies what that means: it folds near-duplicate field names together, which is a meaningful mutation warning beyond the generic destructiveHint annotation. It also discloses platform removals (RETIRED TEMPLATES and SAVED VIEWS) and redirects extraction to storage, setting accurate expectations. No contradiction with the annotations is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description fits a broad multi-action tool into three compact sentences, with the action index front-loaded, retired functionality next, and storage routing last. Parentheticals keep the action list scannable, and the all-caps DESTRUCTIVE and RETIRED flags highlight the non-obvious parts. There is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter tool with no output schema, the overview plus the highly descriptive schema gives an agent strong grounding: it identifies all live actions, warns about retired ones, and routes adjacent work to storage. It does not state return shapes or per-action eligibility semantics directly, but the `describe` action exists and the schema is thorough, so the agent can proceed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains all 15 parameters in detail, including nuanced ones like template_id hard-refusal and content_query AND semantics. The top-level description adds useful conceptual labels (field vocabulary, lexical value search, compound matching) but does not go deeper on individual parameters than the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description anchors to a concrete resource ('Workspace metadata') and enumerates each operation with its action name and a short gloss, e.g. 'lexical value search (search)' and 'folding near-duplicate field names together (fields-merge, DESTRUCTIVE).' It also explicitly distinguishes what the tool is not: templates/views are retired and per-file extraction lives on storage. This makes it easy to identify among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly redirects per-file extraction to the `storage` tool (metadata-extract and metadata-extract-all), addressing the most likely tool-selection confusion. It also warns that retired template/view actions no longer exist here, preventing wasted calls. It does not give a full decision tree among the six metadata actions, but the schema and `describe` action fill that gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources