Skip to main content
Glama
stevyf93II

catalog-mcp

by stevyf93II

catalog-mcp

CI

모든 JSON 카탈로그를 AI 에이전트용 쿼리 도구로 변환하는 MCP 서버입니다.

카탈로그 URL이나 파일(재고 피드, 제품 목록, feedmerge가 게시하는 catalog.json)을 지정하면, 모든 MCP 클라이언트(Claude Desktop, Claude Code, 프로토콜을 지원하는 모든 것)가 레코드에 대해 구조화된 필터링, 그룹화, 순위 지정, 스키마 탐색을 수행할 수 있습니다.

Node 18+. 두 개의 런타임 의존성: MCP SDK와 zod.

Why

에이전트는 큰 JSON 파일을 다루지 못하고 도구를 잘 활용합니다. 에이전트에게 2MB 카탈로그를 주면 레코드를 자르거나, 대충 읽거나, 환각을 일으키지만, 필터 문법이 있는 catalog_query를 주면 "이 두 기능을 갖춘 3만 달러 미만의 가장 저렴한 레코드"를 매번 정확하게 답하며, 조건에 맞는 레코드만 읽습니다.

이 저장소는 제가 프로덕션에서 운영하는 MCP 서버의 일반화된 버전입니다. 매장 현장의 AI 어시스턴트가 정확히 이 도구들(동일한 필터 의미론, 동일한 null 가격 규칙, 동일한 TTL 캐시)을 사용하여 하루 수백 번 실시간 재고 카탈로그를 조회합니다. 이 파이프라인이 속한 구조는 다음과 같습니다:

vendor feed  ->  feedmerge  ->  catalog.json  ->  catalog-mcp  ->  any agent
             (guarded sync)   (versioned)      (query tools)

저는 이 서버를 제 공개 재고 피드에 대해 실행합니다. 아래 예제는 저장소가 독립적으로 작동할 수 있도록 중립적인 카탈로그를 사용합니다.

Related MCP server: mcp-db-server

Quickstart

git clone https://github.com/stevyf93II/catalog-mcp.git
cd catalog-mcp
npm install
npm test                                          # engine, loader, and stdio end-to-end tests

# serve the example catalog
node src/server.js --file examples/telescopes.json --key sku

Claude Desktop에 연결합니다 (claude_desktop_config.json):

{
  "mcpServers": {
    "my-catalog": {
      "command": "node",
      "args": ["/path/to/catalog-mcp/src/server.js"],
      "env": {
        "CATALOG_URL": "https://example.com/catalog.json",
        "CATALOG_KEY": "sku"
      }
    }
  }
}

그런 다음 에이전트에게 "카탈로그에 어떤 유형이 있고 각각의 최저 가격은 얼마인가요?"와 같은 질문을 하면, 에이전트가 catalog_schema, catalog_count_by, catalog_top을 스스로 조합하여 사용하는 것을 지켜보세요.

Tools

Tool

What it does

catalog_query

레코드를 필터링, 정렬, 페이지네이션, 프로젝션합니다

catalog_get

키 필드로 하나의 레코드를 가져옵니다

catalog_count_by

필드별로 그룹화하여 개수를 셉니다 (배열 필드는 각 요소를 개별적으로 셈)

catalog_top

숫자 필드 기준 상위 N개 레코드, 선택적 필터 포함

catalog_values

필드의 고유 값과 개수 — 필터링하기 전에 필드의 어휘를 학습합니다

catalog_schema

레코드에서 추론된 스키마: 유형, 적용 범위, 숫자 범위, 샘플 값

catalog_stats

레코드 수, 소스, 캐시 기간, 선택적 숫자 요약

모든 도구는 읽기 전용이며 멱등적이며, MCP 주석에 그렇게 명시되어 있습니다.

The filter grammar

query, count_by, top에서 사용하는 하나의 작은 명세:

{
  "eq":       { "type": "reflector", "goto": true },
  "min":      { "aperture_mm": 150 },
  "max":      { "price": 1000 },
  "has":      { "features": ["Parabolic Mirror", "Cooling Fan"] },
  "contains": { "name": "dobsonian" }
}
  • eq — 불리언과 null을 포함한 모든 값에 대한 엄격한 동등성.

  • min / max — 숫자 범위. 경계가 있는 필드에 실제 숫자가 없는 레코드는 제외됩니다. 이 규칙은 중요합니다. 프로덕션 카탈로그에서 가격이 없으면 "가격 문의"를 의미하며, "3만 달러 미만의 유닛을 보여줘"라는 요청에 가격을 알 수 없는 유닛이 절대 표시되어서는 안 됩니다.

  • has — 배열 멤버십; 나열된 모든 값이 존재해야 합니다.

  • contains — 문자열 필드에 대한 대소문자 구분 없는 부분 문자열; 필드 "*"는 레코드의 모든 문자열 필드를 검색합니다.

조건은 AND로 결합됩니다. 알 수 없는 최상위 키는 유효한 키를 명명하는 오류를 발생시킵니다. 조용히 무시되는 필터는 에이전트가 자신 있게 잘못된 답변을 보고하는 방법이기 때문입니다.

정렬은 정렬 필드가 없는 레코드를 양방향 모두 끝으로 밀어냅니다. "가격순 정렬"은 null의 벽이 아니라 가격이 있는 레코드를 먼저 보여줍니다.

Configuration

Env var

Flag

Meaning

CATALOG_URL

--url

HTTP(S)를 통한 카탈로그 (url/file 중 정확히 하나)

CATALOG_FILE

--file

디스크의 카탈로그

CATALOG_RECORDS_PATH

--records-path

레코드 배열의 점 경로, 예: data.items

CATALOG_KEY

--key

catalog_get용 레코드 키 필드 (기본값 id)

CATALOG_TTL_SEC

--ttl

가져오기 캐시 TTL(초) (기본값 300)

CATALOG_RECORDS_PATH가 설정되지 않은 경우, 로더는 문서 루트가 배열이면 그것을 사용하고, 정확히 하나의 최상위 객체 배열이 있으면 그것을 사용합니다 ({ "meta": ..., "items": [...] }는 그냥 작동합니다). 문서가 모호하면 거부하고 후보 키를 명명합니다.

새로고침에 실패하면 서버는 오류를 반환하는 대신 마지막으로 유효한 데이터를 제공합니다. 작업 중인 에이전트는 예외보다 5분 전 레코드가 더 낫기 때문입니다. 그리고 catalog_stats는 캐시 기간을 보고하여 데이터의 오래됨이 숨겨지지 않도록 합니다.

Non-goals

  • 데이터베이스가 아닙니다. 카탈로그는 읽기 전용이며 메모리에 상주합니다. 데이터가 JSON 파일에 편안하게 들어가지 않는다면 실제 저장소가 필요합니다.

  • 쓰기 작업이 없습니다. 여기서는 카탈로그를 변경하지 않습니다. 이는 동기화 파이프라인의 작업입니다 (feedmerge 참조).

  • 쿼리 언어가 없습니다. 다섯 개의 필터 키로 에이전트가 실제로 묻는 내용을 처리합니다. 더 복잡한 것은 코드에 속하며 도구 스키마에 속하지 않습니다.

License

MIT

Available Tools

7 tools
catalog_count_byCount records by fieldA
Read-onlyIdempotent

Group records by a field and count each value, most common first. Array fields count each element. Optional filter applies first.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldYes
filterNoFilter spec. Keys: eq (equality: {"type":"tent","heated":true}), min / max (numeric bounds: {"price":100}; records without a number in a bounded field are excluded), has (array membership, all required: {"tags":["a","b"]}), contains (case-insensitive substring: {"name":"alpine"}; use field "*" to search all string fields).

TDQS

A3.6/5.0
Behavior3/5

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

Annotations indicate readOnlyHint, openWorldHint, idempotentHint, and non-destructive. The description aligns with these, adding the behavior of array fields counting each element and default sorting. It also mentions that the filter applies first, influencing results. This adds some value beyond annotations, but it doesn't disclose potential performance implications or edge cases like missing fields.

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 is two sentences with high information density. It front-loads the core behavior, then covers edge cases (arrays) and optional filtering. No fluff; every sentence earns its place.

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 read-only aggregation tool with a well-documented filter schema, the description covers the essential aspects: what it does, how arrays are handled, and that filter applies first. It could mention the return format (e.g., array of {value, count}) since there is no output schema, but the absence is not critical for calling the tool correctly.

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 50%: the filter parameter is well-documented in the schema, but the field parameter has no description. The tool description does not add any details about the field parameter (e.g., type, syntax, examples). It implicitly clarifies that field is used for grouping, but the schema already does that. With only half the parameters covered, the description should compensate but doesn't significantly.

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

Purpose4/5

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

The description clearly states the action (group and count), the resource (records by a field), and the ordering (most common first). It also explains a key nuance: array fields count each element. It distinguishes itself from siblings like catalog_stats by focusing on counting per value rather than aggregate statistics, though it doesn't explicitly name an alternative.

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

Usage Guidelines3/5

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

The description implies when to use this tool: when you want a frequency distribution of field values. It mentions an optional filter but does not specify alternatives or when not to use it. For example, it doesn't differentiate from catalog_values (which might return distinct values) or catalog_stats (aggregates). The usage guidance is clear but not exhaustive.

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

catalog_getGet one record by keyA
Read-onlyIdempotent

Fetch a single record by its key field ("id"). Returns { found, record }.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesValue of the record's "id" field. Numbers are matched loosely.
fieldsNo

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the return shape '{ found, record }', which is not in the annotations, and clarifies the key field. This adds useful behavioral context beyond what annotations provide.

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 is two short sentences, front-loaded with the action and includes the return shape. Every word is necessary; no fluff or redundancy.

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 simple read tool with annotations covering safety and a schema documenting the required key, the description is mostly complete. It explains the return shape and key field. The only gap is the optional 'fields' parameter, which is not mentioned, but that is a minor omission for the core use case.

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

Parameters2/5

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

Schema coverage is only 50%: the 'key' parameter has a description, but 'fields' has none. The tool description does not mention 'fields' at all, so an agent using this description alone would not know that field selection is possible. The description adds no meaning beyond the schema's existing key description, so it fails to compensate for the missing field documentation.

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 uses the verb 'Fetch' with a specific resource 'a single record' and identifies the key field ('id'), distinguishing it from siblings like catalog_query for multiple records or catalog_count_by for counting. This makes the tool's purpose unambiguous.

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 clearly states the intended use case: fetching one record by its key. It does not explicitly mention alternative tools or when not to use it, but the context is clear enough to infer. No exclusions are given, so a 4 is appropriate.

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

catalog_queryQuery the catalogA
Read-onlyIdempotent

Filter, sort, and page through catalog records. Returns { count, total_matching, total_records, records }. Use catalog_schema first if you are unsure which fields exist. Example: filter {"eq":{"condition":"used"},"max":{"price":30000},"has":{"features":["Solar"]}}, sort_by "price".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
fieldsNoProject each record down to these fields.
filterNoFilter spec. Keys: eq (equality: {"type":"tent","heated":true}), min / max (numeric bounds: {"price":100}; records without a number in a bounded field are excluded), has (array membership, all required: {"tags":["a","b"]}), contains (case-insensitive substring: {"name":"alpine"}; use field "*" to search all string fields).
offsetNo
sort_byNoField to sort by. Records missing the field sort last.
sort_dirNoasc

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish that this is a safe, read-only, idempotent operation, so the bar is lower. The description adds useful behavioral context by stating the exact return shape and by giving a concrete filter example, which reveals how records are matched and combined without hiding edge cases.

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?

Three dense, front-loaded sentences with no filler. The return contract, prerequisite sibling tool, and a working example are packed into a compact definition that earns its length.

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?

Given the read-only annotations and no output schema, the description is nearly complete: it covers purpose, return values, a filter example, and a prerequisite. It does not spell out offset/limit pagination behavior beyond 'page through', but the schema defaults and constraints cover the mechanical details.

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 only 50%, so the description carries some burden for parameters like limit, offset, and sort_dir. The filter example does add semantic value for filter and sort_by, but it does not compensate for the undocumented pagination and sorting-direction parameters, which remain dependent on schema names and defaults.

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 opens with a specific verb phrase — 'Filter, sort, and page through catalog records' — that names the resource and the operations precisely. The stated return shape also disambiguates it from the sibling tools like catalog_stats or catalog_get.

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?

It gives explicit guidance to 'Use catalog_schema first if you are unsure which fields exist', which tells the agent when to consult a sibling first. It does not explicitly exclude alternative tools like catalog_top or catalog_count_by, but the query/filter context is clear enough for a capable agent.

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

catalog_schemaInferred catalog schemaA
Read-onlyIdempotent

Field inventory inferred from the records themselves: type, coverage, numeric min/max, and sample values for categorical fields. Call this first when exploring an unfamiliar catalog.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the operation safe via readOnlyHint, openWorldHint, idempotentHint, and non-destructiveHint. The description adds value by revealing that the schema is inferred from the records themselvesans, so its shape is data-dependent, and by detailing the returned content beyond what annotations express.

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 is two tight sentences with no filler. It front-loads the concrete field inventory output before the usage directive, making the purpose immediately obvious.

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

Completeness5/5

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

For a zero-parameter, read-only introspection tool, the description fully covers what the tool returns, when to call it, and how the schema is derived. Annotations cover side-effect safety, so no operational detail is missing.

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

Parameters4/5

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

The tool has zero parameters, so parameter semantics are trivially satisfied; there is nothing for the description to elaborate. The baseline of 4 applies because no parameter documentation burden exists.

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 states a specific verb and output: 'field inventory inferred from the records themselves' and enumerates exactly what is included (type, coverage, numeric min/max, sample values). This clearly distinguishes it from siblings like catalog_stats or catalog_values, which serve different analytical purposes.

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 phrase 'Call this first when exploring an unfamiliar catalog' provides explicit when-to-use guidance and establishes the tool as the initial exploration step. It does not explicitly name sibling alternatives, but the sequencing instruction is clear enough for routing.

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

catalog_statsCatalog totals and freshnessA
Read-onlyIdempotent

Record count, source, cache age, and optional numeric summaries (count/min/max/mean/median) for the fields you name.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNoForce a fresh fetch, bypassing the cache.
numeric_fieldsNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive behavior. The description adds useful behavioral context beyond the schema: output includes cache age, and the refresh parameter can bypass the cache. This is consistent with the annotations and gives the agent a clearer operational picture.

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 is a single sentence with no filler. It front-loads the core output components and packs meaningful detail about optional numeric summaries into a compact, readable form.

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?

With only two optional parameters and no output schema, the description provides a reasonable high-level account of what is returned. It could be more precise about the meaning of 'source' or the exact response structure, but the essential call behavior and output scope are clear enough for an agent.

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

Parameters4/5

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

Schema description coverage is only 50%, with numeric_fields having no schema-level description. The tool description compensates by explaining that numeric summaries (count/min/max/mean/median) are computed for the fields you name. The refresh parameter is already adequately described in the schema.

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

Purpose4/5

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

The description clearly states the tool returns record count, source, cache age, and optional numeric summaries for named fields. It does not use an explicit verb but is specific about the resource and output. It does not explicitly differentiate it from siblings like catalog_count_by or catalog_values.

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

Usage Guidelines3/5

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

The use case is implied: an agent would call this when it needs catalog totals, freshness, or numeric summaries for specified fields. However, there is no explicit guidance about when to choose this over sibling tools, nor any exclusions or alternative routing.

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

catalog_topTop N records by a numeric fieldA
Read-onlyIdempotent

Rank records by a numeric field with an optional filter. Example: sort_by "price", sort_dir "asc", filter {"has":{"features":["Bunkhouse"]}} = cheapest records with that feature.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
fieldsNo
filterNoFilter spec. Keys: eq (equality: {"type":"tent","heated":true}), min / max (numeric bounds: {"price":100}; records without a number in a bounded field are excluded), has (array membership, all required: {"tags":["a","b"]}), contains (case-insensitive substring: {"name":"alpine"}; use field "*" to search all string fields).
sort_byYes
sort_dirNodesc

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, non-destructive, idempotent behavior, so the description need not repeat safety. It adds useful ranking/filter semantics and a concrete example, though it does not explain edge cases like records missing the sort_by field.

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?

Two sentences, with the core action first and a concrete example second. No filler or redundancy.

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

Completeness3/5

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

The tool is simple enough and the schema covers filter syntax, limit bounds, and sort direction defaults. But there is no output schema and the description does not state the return shape (full records vs. projected fields), which is a notable gap for correct invocation.

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 only 20%, so the description should compensate; the example meaningfully maps sort_by, sort_dir, and filter together. However, it does not clarify the fields parameter or how limit interacts with ranking, leaving a partial gap.

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 clearly states it ranks records by a numeric field with optional filtering, and the worked example (sort_by price, sort_dir asc, filter has features) demonstrates a concrete use. This distinguishes it from siblings like catalog_get, catalog_count_by, and catalog_values.

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 implies when to use it: when you need ordered/top-N records over a numeric field, optionally narrowed by a filter. The example gives a concrete scenario, but it does not explicitly name alternatives or state when not to use it.

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

catalog_valuesDistinct values of a fieldA
Read-onlyIdempotent

All distinct values of a field with occurrence counts, most common first. The reliable way to learn a categorical field's vocabulary before filtering on it.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldYes
limitNo0 = unlimited

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral context: it returns occurrence counts, sorts most common first, and positions itself as reliable for vocabulary discovery. It doesn't mention pagination or what happens with high-cardinality fields, but the limit parameter with '0 = unlimited' partially covers that.

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?

Two sentences with no wasted words. The first sentence states the core behavior (distinct values, counts, ordering), and the second adds the practical use case. Information is front-loaded and every word earns its place.

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 read-only, idempotent tool with two parameters and no output schema, the description is nearly complete. It explains what the tool returns (distinct values with counts, sorted) and when to use it. The only minor gap is not describing the output format structure (e.g., array of objects with value/count keys), but the description's clarity compensates for the missing output schema.

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

Parameters4/5

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

Schema description coverage is 50%: 'field' has no description, while 'limit' has a description and default. The description clarifies that the tool returns distinct values with counts, which implies the 'field' parameter is the target field. It doesn't add detail about the 'limit' parameter beyond the schema, but the schema already documents it well. The description compensates for the undocumented 'field' parameter by explaining the tool's purpose.

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 states a specific verb ('catalog') and resource ('values of a field'), and clearly distinguishes itself from siblings by emphasizing occurrence counts and ordering. It also explains the practical use case (learning a categorical field's vocabulary before filtering), which makes the tool's purpose immediately clear.

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 implies when to use this tool: when you need distinct values with counts before filtering. It doesn't explicitly name alternatives or exclusions, but the phrase 'reliable way to learn a categorical field's vocabulary' provides clear context. Sibling names like catalog_top and catalog_count_by suggest related tools, but the description doesn't explicitly contrast them.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.0
    • First observedcatalog_count_by
    • First observedcatalog_get
    • First observedcatalog_query
    • First observedcatalog_schema
    • First observedcatalog_stats
    • First observedcatalog_top
    • First observedcatalog_values

TDQS

A4/5.0

Scored across 7 tools

Disambiguation3/5

catalog_values and catalog_count_by both return per-value occurrence counts, catalog_top is essentially a sorted special case of catalog_query, and catalog_stats overlaps with catalog_schema's min/max summaries. Each tool has a slightly different focus, but the boundaries are fuzzy enough that an agent could easily misselect.

Naming Consistency4/5

All tool names share the catalog_ prefix and snake_case, so the namespace is predictable. The suffixes are not uniformly verb_noun—schema/stats/values are nouns while get/query/count_by/top are verb-like—so it is mostly consistent rather than perfectly patterned.

Tool Count5/5

Seven tools is a well-scoped size for a catalog exploration server: enough for schema discovery, statistics, filtering, record retrieval, grouping, and value enumeration without bloat.

Completeness5/5

For a read-only catalog/exploration domain, the set covers the full workflow: understand the schema, inspect summary statistics, learn field vocabulary, filter/sort/page records, fetch by id, and aggregate/rank. No obvious dead-end operation is missing.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    An integration layer for AI agents that provides a catalog of tools from various sources (OpenAPI, GraphQL, MCP, etc.) and can be used as an MCP server for compatible agents.
    4,160
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that exposes relational databases (PostgreSQL/MySQL) to AI agents with natural language to SQL query support.
    19
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables AI agents to generate, search, and reason over knowledge graphs from code, databases, docs, and open-data portals without requiring an LLM or API key.
    Apache 2.0