mcp-api-bridge
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-api-bridgefind concerts in New York this month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-api-bridge
An MCP server that puts your existing in-house catalog search APIs in front of any MCP client, with Amazon Bedrock doing the natural-language → structured query translation.
Two ideas carry the whole thing:
Catalogs are configuration, not code. A YAML file describes each API's URL, auth, request shape, and response shape. Adding a catalog means adding a config block.
The filter vocabulary is the prompt. The
description,type, andvaluesyou write for each filter are handed to Bedrock verbatim as the vocabulary it maps language onto. Describe a filter well and query understanding works for it — there is no separate prompt to maintain.
MCP client ──▶ mcp-api-bridge ──▶ Bedrock (Claude) plan the query
│
└──────────▶ your catalog REST API execute the searchTools exposed
Tool | What it does |
| Describes every configured catalog: its filters, allowed values, and sorts. Call this first to learn the vocabulary. |
| Runs a search with explicit |
| Fetches one item by id, for catalogs that configure a |
| Bedrock turns a natural-language query into a |
|
|
catalog_search is deliberately usable on its own: when the client is already
an LLM that knows the filter vocabulary from list_catalogs, the Bedrock hop
is redundant latency. Reach for smart_search when a raw end-user string
needs interpreting.
Related MCP server: Amplify Data API MCP Server
Quick start
uv venv && uv pip install -e ".[dev]"
cp config/catalog.example.yaml config/catalog.yaml # then edit
cp .env.example .env # then fill in
export MCP_API_BRIDGE_CONFIG=./config/catalog.yaml
export CATALOG_TOKEN=... # whatever your config's auth blocks name
export AWS_REGION=us-east-1 # plus standard AWS credentials
.venv/bin/mcp-api-bridge # speaks MCP over stdioRegister it with an MCP client:
{
"mcpServers": {
"catalog": {
"command": "/path/to/mcp-api-bridge/.venv/bin/mcp-api-bridge",
"env": {
"MCP_API_BRIDGE_CONFIG": "/path/to/config/catalog.yaml",
"CATALOG_TOKEN": "...",
"AWS_REGION": "us-east-1"
}
}
}
}Importing from OpenAPI
Hand-writing config stops being viable fast: the bundled
catalog-search-service-api.json declares 49 query parameters on one
operation across three sibling endpoints. import-openapi reads the spec and
emits config, so the wire contract comes from the API team's own document.
# See what's in the spec
mcp-api-bridge import-openapi catalog-search-service-api.json --list
# Generate, curating the filters that reach the model
mcp-api-bridge import-openapi catalog-search-service-api.json \
--operation productions=searchProductions \
--include productions=startDate,endDate,city,stateCode,months,minListingPriceFloor \
--operation performers=getPerformers \
--include performers=activeFilter,minProductionCount \
-o config/catalog.yamlconfig/vividseats.example.yaml was scaffolded this way, then hand-edited for
the parts below that no spec can supply.
It takes from the spec: base URL, method, path, parameter names, types, enums,
descriptions, paging defaults, the response envelope, and the auth scheme. It
strips HTML out of descriptions first — 81 of the 150 parameter descriptions in
that spec contain <br/> or <b>, and those strings become the model's
vocabulary.
It cannot take the semantic roles, because OpenAPI does not carry them: which parameter is the free-text query, which response field is the title, when each sort applies. Those are guessed by name and every guess is reported — to stderr as it runs, and as a comment block at the top of the generated file:
note: roles matched by name: query=query, page=page, page_size=pageSize, sortBy=sort — verify
note: first_page=1 taken from the 'page' default
TODO: base_url ...vividseats-staging.com looks non-production — confirm before deploying
TODO: sort descriptions are blank — the spec has only raw enum values--include matters more than it looks. Every filter enters the
query-understanding prompt, so importing all 45 makes the prompt expensive and
gives the model a wide surface to invent against. The importer nags when an
uncurated import exceeds 15 filters.
One thing the spec cannot fix. That spec declares no securitySchemes at
all, so the importer writes auth: none; if a gateway fronts the API, that is
invisible here. (The opaque-id problem it also surfaces is handled — see the
next section.)
The importer needs no dependencies beyond PyYAML — $refs are resolved on
demand with cycle guards, because real specs are cyclic (Production → Venue
→ Production).
Opaque ids: names in, ids out
The best filters on a real catalog are keyed by ids — regionId, performerId,
venueId, categoryId. No model turns "Taylor Swift in Chicago" into
performerId=9134®ionId=5 from a description, so a filter like that is dead
weight in the vocabulary. Declaring how a filter's values resolve brings it
back to life. Two strategies, because there are two shapes of id:
lookup — closed sets (regions, categories). The bridge fetches the table
once, publishes the names as the filter's vocabulary, and translates back to
the id on the way out. This is not an optimization: GET /v1/regions filters
by IP and lat/long only, so holding the list is the only way to match
"Chicago".
region:
param: regionId
type: integer
description: Metro area the event's venue sits in.
lookup:
path: /v1/regions
id_field: id
name_field: name
alias_fields: [listName] # accept "Chicago, IL" tooresolve — open sets (performers, venues). No table can be preloaded, so
the model supplies the name it read and the bridge searches a sibling catalog
for it. Pointing this at the Algolia-backed search service is deliberate — it
handles misspellings and partial names, which is exactly what resolution needs.
performer:
param: performerId
type: integer
description: Artist, team, or touring show.
resolve:
api: performers # another configured catalogEither way the caller passes a name and gets told what it became:
"resolutions": {
"performer": {"name": "Taylor Swift", "id": "9134"},
"region": {"name": "Chicago", "id": "5"}
}That readback matters because resolution is a guess where names collide —
"Chicago" is a city, a band, and a musical. list_catalogs marks these filters
accepts_name, listing allowed_values for closed sets and leaving it null for
open ones. An id passed directly still works and skips the lookup entirely; an
unrecognised name gets a did-you-mean.
config/vividseats.example.yaml wires both services together this way:
catalog-service for authoritative data and the reference tables,
catalog-search-service for name resolution.
Configuring a catalog
config/catalog.example.yaml is a commented walkthrough of both common
shapes: a GET search API with a nested response envelope, and a POST search
API with body filters and zero-indexed paging. Generated config uses the same
format, so anything below applies to imported catalogs too. The pieces:
Request templating. Any value under query: or body: may contain
{query}, {page}, {page_size}, or {sort}. A value that is exactly one
placeholder keeps its type (size: "{page_size}" sends an integer). A
placeholder with nothing to fill it drops the whole parameter — that is how
optional params disappear when the caller omits them. Values with no
placeholder are sent as-is, which covers static params like channel: web.
Response mapping. items_path and total_path locate the result list and
the count inside whatever envelope the API uses. Paths are dotted with
optional indices — data.items, media[0].url, variants[*].sku. fields
maps the five normalized fields (id, title, description, url, image);
attributes carries anything else through untouched. With no fields mapping
at all, the raw upstream item passes through as attributes.
Auth. none, bearer, api_key (header or query param), or basic.
Every variant names an environment variable; no credential is ever read from
the config file.
Paging. first_page: 0 for APIs that page from zero. Callers always pass
1-based page; the bridge translates.
The Bedrock layer
understand_query constrains Claude to the QueryPlan schema via structured
outputs, so the response is always parseable — no regex over prose, no retry
loop for malformed JSON. The plan carries:
keywords— search terms with filter-like phrases removed, so the keyword match is not fighting the filtersfilters— only names the catalog actually exposessort— only sorts the catalog actually exposesexpansions— domain synonyms to retry with if results are thinintentandambiguities— for the trace, and for a client deciding whether to ask a clarifying question
Filters and sorts the model invents anyway are dropped before they reach the catalog, so a hallucination degrades to a slightly broader search rather than a failed request.
Defaults are anthropic.claude-opus-5 at effort: low — query understanding
is a short hop in front of the real work, and low effort keeps it cheap
without changing the answers on typical queries. Override per deployment:
bedrock:
model_id: anthropic.claude-opus-5
effort: medium
guidance: |
Domain shorthand the model should know about.or with $BEDROCK_MODEL_ID / $BEDROCK_EFFORT / $BEDROCK_REGION.
Bedrock is only ever on the understand_query and smart_search paths. If it
is unreachable, catalog_search, catalog_get_item, and list_catalogs keep
working — and smart_search says so in its error rather than failing silently.
Tests
.venv/bin/pytestThe suite mocks the catalog HTTP layer with respx and stubs the Bedrock
client, so it runs with no network and no AWS credentials. The OpenAPI tests
run against the real catalog-search-service-api.json rather than a tidy
fixture — its cyclic $refs, HTML descriptions, 3.1 type unions, and missing
security scheme each broke a first draft of the importer.
Available Tools
5 toolscatalog_get_itemA
Fetch a single catalog item by its id.
Args:
item_id: The catalog's own identifier, as returned in a search
result's id field.
api: Which catalog to read from. Optional when only one is configured.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | ||
| item_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral burden. 'Fetch a single catalog item' conveys a read-only, non-destructive operation. However, it does not disclose behavior for missing/unknown ids, whether api is required when multiple catalogs exist, or any auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and effective: one clear purpose sentence plus two parameter bullets with no filler. The most important information is front-loaded, and every line earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter fetch with an output schema available, the description covers both parameters and the main usage path. The only notable gap is the lack of explicit behavior when api is omitted while multiple catalogs are configured.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description documents both parameters meaningfully: item_id is tied to a search result's `id` field, and api selects the catalog with an optionality condition. This adds real value beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch a single catalog item by its id.' It clearly distinguishes itself from sibling search tools by targeting a single item via the catalog's own identifier rather than a query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: item_id is the identifier returned in a search result's `id` field, which implies this tool is used after catalog_search or smart_search. It does not explicitly name alternatives or state when not to use it, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_searchA
Search a catalog with keywords and explicit structured filters.
Args:
query: Keyword terms only. Put constraints in filters, not here —
a phrase like "under $80" left in the query fights the filter.
api: Which catalog to search. Optional when only one is configured.
filters: Filter names from list_catalogs mapped to values. A list
value means "any of these". For accepts_name filters pass the
human name — the bridge resolves it to the upstream id and
reports what it chose in resolutions.
sort: A sort name from list_catalogs. Omit for catalog default.
page: 1-based page number.
page_size: Results per page. Defaults to the catalog's configured size.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | ||
| page | No | ||
| sort | No | ||
| query | Yes | ||
| filters | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| api | Yes | |
| page | Yes | |
| sort | No | |
| items | Yes | |
| query | Yes | |
| total | No | |
| page_size | Yes | |
| resolutions | No | What each name-valued filter resolved to, e.g. {"performer": {"name": "Taylor Swift", "id": "9134"}}. Ambiguous names resolve to a best guess — check this before trusting results. |
| filters_applied | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so well. It explains how filters are interpreted (list value means 'any of these'), how accepts_name filters are resolved to upstream ids, and what the bridge reports in resolutions. It also warns that mixing phrases like 'under $80' into the query fights the filter. It stops short of explicitly stating that the operation is read-only or describing error/edge-case behavior, but for a search tool the read-only nature is strongly implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized for a tool with six parameters. The opening sentence front-loads the core purpose, and the Args section is a clean bulleted list where every line adds unique information. There is no filler, repetition of schema type information, or unnecessary prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of six parameters, no annotations, and the existence of an output schema, the description is highly complete. It covers parameter defaults, value sources, filter interpretation, name resolution behavior, and pagination semantics. The only missing piece is explicit sibling selection guidance, but that is already accounted for in the usage guidelines dimension; for invoking this specific tool correctly, an agent has everything it needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate, and it does. Every one of the six parameters is explained with meaningful semantics beyond the schema's bare type declarations: query is keyword-only, api is optional when only one catalog is configured, filters map names from list_catalogs to values, sort comes from list_catalogs, page is 1-based, and page_size defaults to the catalog's configured size. This is exactly the kind of parameter documentation an agent needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search a catalog with keywords and explicit structured filters.' It clearly distinguishes this tool from the sibling list_catalogs, catalog_get_item, and understand_query by emphasizing structured filters, and the term 'explicit structured filters' implicitly contrasts with smart_search. The first sentence alone tells an agent what this tool does and where it fits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong parameter-level guidance: query should contain only keywords, constraints belong in filters, filter names come from list_catalogs, and sort names also come from list_catalogs. However, it never explicitly states when to choose this tool over smart_search or understand_query, nor does it say 'use this when you have structured filters, not for natural language queries.' The usage context is implied rather than explicitly contrasted with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_catalogsA
List the configured catalogs and the vocabulary each one accepts.
Returns every catalog's filter names, types, allowed values, and sort
options. Call this before catalog_search so you filter with names the
catalog actually exposes.
Filters marked accepts_name are keyed by an opaque id upstream but
take a human name here — pass "Chicago", not a region id. Where the
value set is closed it is listed in allowed_values; where it is open
(performers, venues) any name is accepted and resolved on the way
through.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| catalogs | Yes | |
| default_catalog | No | The catalog used when a tool's `api` argument is omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explains the accepts_name nuance (opaque ids upstream vs human names here) and distinguishes closed vs open value sets, which is valuable beyond a simple listing. It doesn't cover potential error conditions or pagination, but for a read-only list tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and logically structured: it states the core purpose, adds a usage directive, and then explains key data semantics. Every sentence earns its place, and the critical usage instruction is front-loaded before the detailed nuances.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there are no parameters and an output schema exists, the description provides sufficient context for correct usage: it tells when to use it, what it returns, and how to interpret the returned data. It doesn't need to explain return structure since the output schema covers that, and it fully prepares the agent to interact with catalog_search.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline per guidelines is 4. The description adds no parameter-related meaning because there are none, and the schema coverage is complete (empty properties). No deduction is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists configured catalogs and the vocabulary each accepts, including specific details like filter names, types, allowed values, and sort options. It explicitly references the sibling catalog_search, distinguishing itself as a precursor rather than a search or retrieval tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: 'Call this before `catalog_search`' and explains why, so an agent knows exactly when to invoke it. It also clarifies how to interpret results for filtering, which is actionable and context-specific.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smart_searchA
Interpret a natural-language query with Bedrock, then run the search.
Returns both the plan and the results, so you can see which filters were
inferred and re-run with catalog_search if the interpretation is off.
If the results are thin, the plan's expansions are alternative terms
worth retrying.
Args: query: The user's request, in their own words — no need to strip constraints out first. api: Which catalog to search. Optional when only one is configured. page: 1-based page number. page_size: Results per page. Defaults to the catalog's configured size.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | ||
| page | No | ||
| query | Yes | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | |
| results | Yes | |
| model_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals the two-stage behavior (interpret then search), the return of plan and results, and the presence of expansions in the plan. It does not discuss side effects, authentication, or rate limits, but for a search tool these are typically not critical. The description adds meaningful context beyond a generic 'search'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and efficient. It front-loads the core purpose and then adds a useful note about the plan/results and alternative tool. The Args section is compact but informative. It is slightly verbose with the explanatory paragraph, but each sentence adds value; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters and an output schema, the description is quite complete. It explains the return of plan and results, mentions expansions, and covers all parameters. It does not describe the output schema structure, but that is covered by the output schema itself. It lacks explicit error-handling notes, but that is not a major gap for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides detailed parameter semantics in the Args section: it explains that query is the user's natural-language request with no need to strip constraints, api is optional and catalog-specific, page is 1-based, and page_size defaults to the catalog's configured size. Since the schema itself has no descriptions (coverage 0%), the description fully compensates, making parameter intent crystal clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Interpret a natural-language query with Bedrock, then run the search.' It identifies the resource (a catalog search) and the distinguishing behavior (natural-language interpretation). It also contrasts with sibling tool catalog_search by noting the ability to re-run with it, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete guidance: it explains that the tool returns the plan and results so you can verify inferred filters and re-run with catalog_search if interpretation is off. It also mentions expansions as alternatives when results are thin. This gives clear context for when to use this tool vs. alternatives, though it does not explicitly list exclusions for all siblings (e.g., understand_query, list_catalogs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
understand_queryA
Turn a natural-language query into a structured search plan, without searching.
Uses Bedrock to split a shopper's phrasing into keywords, structured
filters, a sort, and synonyms — restricted to the vocabulary the target
catalog actually exposes. Use this when you want to inspect or adjust
the plan before running it; use smart_search to do both at once.
Args: query: The user's request, in their own words. api: Which catalog's vocabulary to plan against. Optional when only one is configured.
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| api | Yes | |
| plan | Yes | |
| model_id | Yes | |
| original_query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden itself. It discloses that the tool does not search, that it uses Bedrock, and that it restricts output to the target catalog's exposed vocabulary by splitting into keywords, filters, sort, and synonyms. It does not mention potential failure modes or permissions, but for a planning-only tool the behavior is transparent enough to set correct expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose and key non-behavior ('without searching') appear in the first sentence. The usage note, behavior summary, and parameter explanations each add distinct value with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter planning tool with an output schema, the description covers purpose, usage, behavior, and parameters sufficiently. It could add how to know valid `api` values when multiple catalogs are configured, but the sibling `list_catalogs` likely covers that, and the description already notes the optional case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must define both parameters itself. It does so clearly: `query` is 'The user's request, in their own words,' and `api` is 'Which catalog's vocabulary to plan against. Optional when only one is configured.' This adds real meaning beyond the bare schema types and even explains the optionality condition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-plus-resource statement: 'Turn a natural-language query into a structured search plan, without searching.' It also distinguishes itself from the sibling `smart_search` by noting the split between planning and executing, so an agent can clearly tell when this tool is the right one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Use this when you want to inspect or adjust the plan before running it; use `smart_search` to do both at once.' This names the alternative and gives the conditional that selects this tool over it, leaving no ambiguity about when to call it.
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.
5 tool updates
v0.1.0- First observed
catalog_get_item - First observed
catalog_search - First observed
list_catalogs - First observed
smart_search - First observed
understand_query
TDQS
Scored across 5 tools
Each tool has a clearly distinct role: list_catalogs exposes metadata, catalog_search executes structured searches, catalog_get_item fetches a single item, understand_query only plans from natural language, and smart_search both plans and searches. The descriptions explicitly contrast the NL tools and the structured-search tool, eliminating ambiguity.
Tool names mix conventions: list_catalogs and understand_query are verb-first, while catalog_search and catalog_get_item are noun-first, and smart_search is an adjective-noun compound. The inconsistency is noticeable but not chaotic, with a 'catalog_' prefix for search/get actions providing some order.
Five tools is a well-scoped size for a catalog search bridge: metadata discovery, structured search, item retrieval, NL interpretation, and NL search. Each tool earns its place with no redundant coverage, making the set feel appropriately lean.
The surface covers the full query lifecycle: discover catalogs, run structured searches, retrieve individual items, and process natural language either as a plan or as a plan-plus-search. As a read-only bridge, missing create/update/delete operations are not gaps; no dead ends remain for the stated purpose.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server for searching Airweave collections with natural language queries.
The AWS Knowledge MCP server is a fully managed remote Model Context Protocol server that provides real-time access to official AWS content in an LLM-compatible format. It offers structured access to AWS documentation, code samples, blog posts, What's New announcements, Well-Architected best practices, and regional availability information for AWS APIs and CloudFormation resources. Key capabilities include searching and reading documentation in markdown format, getting content recommendations, listing AWS regions, and checking regional availability for services and features.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- AlicenseBqualityFmaintenanceAn MCP server that enables users to retrieve information from AWS Knowledge Bases using RAG (Retrieval-Augmented Generation) via Bedrock Agent Runtime.1146 npmMIT
- FlicenseNot gradedqualityDmaintenanceThis MCP server enables users to interact with AWS Amplify Gen2 application data through natural language, allowing AI assistants like Claude to perform operations on Amplify data models using conversational language instead of complex code.4-
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables large language models to directly access and analyze Amazon product information, including product details, variants, and reviews.-
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables natural language interaction with Google's Discovery Engine API, allowing users to search, recommend, and manage data through conversational interfaces.-