Skip to main content
Glama

VectorSmith

Your vector database, forged into tools an agent can actually use.

Write a tools.yaml. VectorSmith compiles it into typed, tenant-guarded tools — then you either import them in Python or serve them over MCP.

License Python 3.11+ TDS MCP Version Backend status Docs

What it is · How it works · Write YAML · Python · Claude / Codex / Cursor · Production HTTP · Backend evidence · Try it · Docs


Why this exists

Agents that talk to your invoices, tickets, or catalog usually get one of two bad options:

Typical approach

What goes wrong

Vendor MCP (Qdrant / Pinecone / …)

Cluster admin tools. Upsert, delete, create-collection. The model can wander.

Hand-bind JSON schemas to LangChain / the OpenAI SDK

You re-implement filters, limits, and tenant isolation in Python. Every agent copies it.

“Just embed and search() in the system prompt”

No typed args. No enums. No hidden tenant = acme.

VectorSmith is the third option: the data store stays yours. The tools are a YAML contract. The compiler turns that contract into MCP schemas or in-process tools. The agent never sees the URL, the API key, or the tenant filter.

  you write                         VectorSmith                    the agent sees
─────────────                   ─────────────────                ────────────────
 tools.yaml          ──▶   interpolate → validate → compile  ──▶  search_invoices
 tenant: acme                    Engine stays internal            query, client, status
 ${QDRANT_URL}                                                    (no tenant, no URL)

Related MCP server: openapi-mcp-bridge

How it works

flowchart LR
  subgraph author["You"]
    Y["tools.yaml"]
    E[".env / ${VAR}"]
  end
  subgraph vs["VectorSmith"]
    L["load + secret lint"]
    V["validate VBxxxx"]
    C["compile schemas + plan"]
  end
  subgraph out["Consume once"]
    P["load_tools() / connect()"]
    M["vectorsmith serve"]
  end
  subgraph hosts["Hosts"]
    A["LangChain · LangGraph · Agents SDK · Anthropic"]
    H["Claude · Codex · Cursor · claude.ai"]
  end
  Y --> L
  E --> L
  L --> V --> C
  C --> P --> A
  C --> M --> H

One file, two doors. Same compiled tools.

Python app

Chat / IDE host

Install

pip install "vectorsmith[qdrant,langchain]"

pip install "vectorsmith[qdrant]" so vectorsmith is on PATH

Call

from vectorsmith import load_tools

vectorsmith serve tools.yaml --name invoices

Process

In-process. No subprocess.

The host spawns the CLI (MCP stdio or HTTP)

Mix-in

Your @tools + Slack/GitHub via an MCP client

Other mcpServers keys sit next to it

You do not import an executor. You do not copy inputSchema into the LLM SDK.


Write a tool, not a prompt

A tool is a name, a description (so the model picks it), a collection, optional text search, parameters the model may pass, and filters it must never see:

tds_version: "1"

connections:
  invoices:
    backend: qdrant
    url: ${QDRANT_URL}              # secrets only here, only as ${VAR}
    api_key: ${QDRANT_API_KEY:-}

tools:
  - name: search_invoices
    kind: search
    description: >
      Search invoices by free text and filter by client, status, or amount.
      Use when the user asks about invoices, billing, or payments.
    target: { connection: invoices, collection: invoices }
    query: { param: query, required: false }
    static_filters:
      - { path: tenant, op: eq, value: acme }    # hidden from the model
    parameters:
      - { name: client, path: client_name, dtype: keyword, op: eq }
      - { name: status, path: status, dtype: keyword, op: in,
          enum: [draft, sent, paid, overdue] }
      - { name: min_amount, path: amount, dtype: float, op: gte }
    output:
      fields: [invoice_id, client_name, status, amount]
      limit_default: 10
      limit_max: 50

vectorsmith init ./demo writes a starter file. The full field list — kinds, operators, pipelines, built-ins, every backend — is in docs/tools-yaml-reference.md.

What the model sees

{
  "name": "search_invoices",
  "description": "Search invoices by free text and filter by client, status, or amount. …",
  "inputSchema": {
    "type": "object",
    "properties": {
      "query": { "type": "string" },
      "client": { "type": "string" },
      "status": {
        "type": "array",
        "items": { "type": "string", "enum": ["draft", "sent", "paid", "overdue"] }
      },
      "min_amount": { "type": "number" },
      "limit": { "type": "integer", "minimum": 1, "maximum": 50, "default": 10 }
    }
  }
}

tenant: acme is not in that schema. The engine ANDs it on every call. Credentials never leave connections.

Kinds you can declare

kind

For

Typical tool

search

Semantic retrieve + filters

search_invoices

lookup

Exact id, limit 1

get_invoice

count

“How many overdue?”

count_invoices

scroll

Filter / page, no ANN

list-style tools

pipeline

Retrieve → post_filter / group_by / sort / project

top-N per client

Built-ins (search_<connection>, get_<connection>_by_id, …) are opt-in on the connection. Turn them off if you already named a user tool the same way.


In your agent (Python)

pip install "vectorsmith[qdrant,langchain]"
from vectorsmith import load_tools
from langchain.agents import create_agent

tools = load_tools("tools.invoices.yaml", "tools.tickets.yaml")
agent = create_agent("openai:gpt-4.1", tools)
# … await tools.aclose()

Same YAML, other stacks:

from vectorsmith.langgraph import load_tools      # create_react_agent / ToolNode
from vectorsmith.openai_agents import load_tools  # Agent + Runner
from vectorsmith.anthropic import load_tools      # messages.create(tools=vs.tools)
from vectorsmith import connect                   # await vs.call("search_invoices", {…})

Authenticated Python applications can pass ctx=CallContext(...) to BoundTools.call(). Supported LangChain/LangGraph, OpenAI Agents, and Anthropic paths propagate that principal, claims/roles, tenant, deadline, and request ID. The application is responsible for constructing caller context from an authenticated request. See the Python API and security profiles.

Extra

Import

vectorsmith[langchain]

from vectorsmith import load_tools

vectorsmith[langgraph]

same tools; LangGraph graph

vectorsmith[openai-agents]

from vectorsmith.openai_agents import load_tools

vectorsmith[anthropic]

from vectorsmith.anthropic import load_tools

Worked apps: examples/langchain_agent · langgraph_agent · openai_agents · anthropic_agent.


In Claude, Codex, Cursor

Those products cannot import vectorsmith. They spawn a process. Point them at serve with the same YAML.

{
  "mcpServers": {
    "invoices": {
      "command": "vectorsmith",
      "args": ["serve", "tools.invoices.yaml", "--name", "invoices"]
    }
  }
}

Codex is TOML (~/.codex/config.toml), not JSON. Claude Code uses .mcp.json — it does not read the Desktop file.

Host

Config

Guide

Claude Desktop

claude_desktop_config.json

docs/integrations/claude-desktop.md

Claude Code

.mcp.json / claude mcp add

docs/integrations/claude-code.md

OpenAI Codex

~/.codex/config.toml

docs/integrations/openai-codex.md

Cursor

.cursor/mcp.json

docs/integrations/cursor.md

claude.ai

serve --http --auth builtin

docs/quickstart-selfhost.md

Copy-paste snippets: examples/mcp_hosts/. Slack, GitHub, filesystem stay separate servers — coexistence.


Production HTTP server

0.2.0 is the production HTTP cut. vectorsmith serve --http is Streamable HTTP MCP (POST /mcp) for claude.ai, gateways, and Kubernetes. Every security.* / observability.* / credential / profiles.enterprise knob in YAML is applied at process start — the same contract connect / load_tools use in-process.

That describes the HTTP runtime, not stable backend status. All six adapters currently remain experimental; see backend evidence before making a production support claim.

pip install "vectorsmith[qdrant,auth-jwt,otel]"

vectorsmith serve tools.yaml --http 0.0.0.0:8080 --auth jwt \
  --jwks-url https://auth.example.com/.well-known/jwks.json \
  --jwt-issuer https://auth.example.com --jwt-audience vectorsmith \
  --log-format json --live-embed

Localhost demo: --http 127.0.0.1:8080 --auth none. --auth none off loopback exits 3. Builtin OAuth (--auth builtin, the HTTP default) needs https:// --public-url.

Concern

How

Who is calling

--auth jwt (JWKS / RS256) · api_key · builtin OAuth. Extra vectorsmith[auth-jwt]

Tenant isolation

Hidden static_filters and/or security.tenancy (claim / header). Pick one layer unless you intend both

Which tools

security.rbac (roles, deny_tools). Applied on the inner name of run_tool

Secrets

connections.*.credentials.provider: env · vault · aws_sm · k8s. Extra vectorsmith[creds-aws]

Quotas

security.rate_limit (off by default). In-memory or Redis (vectorsmith[auth-redis]). HTTP 429

Health

GET /healthz (liveness). GET /readyz 503 if a connection, required embedder, or JWT JWKS is down

Observability

--log-format json (request_id, trace_id, span_id). observability.tracing → OTLP (vectorsmith[otel]). GET /metrics. Audit file / HTTP / OTLP

Hardening

profiles.enterprise + validate --enterprise --strict. Refuses serve / connect if tenancy / limits / backends fail

Search quality

Pluggable embedders, query.expand, tool.rerank (http / cohere / local cross_encoder)

Many catalogs

Extra YAML args, --route-by-claim, --default-project. Duplicate tool names fail at start

Drain

--shutdown-grace-s (default 30). New POST /mcp is 503 while draining

Reference catalog: examples/enterprise/. Chart and probes: Kubernetes. Full model: enterprise · hardening · observability.


Stores

backend on a connection is one of six adapters. All currently have experimental support status: the advertised read-only surface is usable and tested, but the complete fault and supported-version matrix required for stable status is not finished. Unsupported semantics fail validation instead of silently returning partial or unfiltered results.

qdrant · pgvector · chroma · pinecone · weaviate · milvus

The deterministic local matrix covers hidden tenant filters, exact IDs, counts, pagination, projection, nested and array filters, hybrid ranking, typed introspection, server-side embedding, score direction, edge-case payloads, read-only builtins/drafts, cleanup, and error translation. Current generated pass/skip counts and tested client/server versions are in backend conformance for exact server/client versions, per-backend results, tested behavior, and remaining stability blockers.

The current capability matrix advertises hybrid search only for Qdrant and Weaviate. pgvector can run in table mode (no vector column) for lookup, count, scroll, and pipelines. Pinecone intentionally rejects filter-only scroll, filtered count, hybrid mode, and exact-ID builtins that cannot preserve metadata guardrails. Full operator and feature details: vector stores.

Production extras (install what you turn on in YAML):

Extra

For

auth-jwt

serve --auth jwt

auth-redis

Shared OAuth tokens and Redis rate limits

otel

OTLP traces from observability.tracing

creds-aws

credentials.provider: aws_sm

embed-openai / embed-cohere

Hosted embedders (and Cohere rerank)

rerank-local

rerank.provider: cross_encoder

Full inventory: library surface.


Try it

The invoice example is a tools.yaml plus an env file. Copy .env.example and set QDRANT_URL to your cluster before validate / test / serve.

# clone, then:
uv sync

uv run vectorsmith validate examples/qdrant_invoices/tools.invoices.yaml \
  --env-file examples/qdrant_invoices/.env.example

uv run vectorsmith test examples/qdrant_invoices/tools.invoices.yaml search_invoices \
  --args '{"query":"Globex invoice","limit":3}' \
  --env-file examples/qdrant_invoices/.env.example

uv run vectorsmith serve examples/qdrant_invoices/tools.invoices.yaml --name invoices \
  --env-file examples/qdrant_invoices/.env.example

Tickets are a second file / second MCP name: tools.tickets.yaml--name tickets.

Example walkthrough


CLI

Command

Does

init

Write a starter tools.yaml + .env.example

validate

Compile + lint. --live pings the store. --live-embed smoke-tests the embedder. --enterprise / --policy / --policy-builtin for production gates. --strict fails on warnings

test

Call one compiled tool without serving

serve

MCP stdio (Desktop / Codex / Cursor; --watch on by default) or --http HOST:PORT (no watch). HTTP --auth: builtin (needs https --public-url) · jwt · api_key · none (loopback only). --live-embed includes the embedder on /readyz.

introspect

Collection / field metadata to --out (default schema.json). Requires --connection.

discover --experimental

Introspect live collections and write pending schema-backed drafts without changing tools.yaml.

eval --experimental

Execute checked-in tool-call scenarios and write row/isolation/score invariant results.

drift --experimental

Compare a metadata-only schema export with live introspection; report suggestions without auto-promotion.

drafts / approve

drafts list|reject NAME. Approval preserves YAML formatting, increments the catalog version, records provenance, and supports --dry-run.

auth

rotate-secret | revoke for builtin HTTP OAuth

migrate

tds_version 1 → 2 (--dry-run / --write)

validate exits 0 / 1 (--strict warnings) / 2 (errors). Experimental eval and drift use 1 for failed scenarios or detected drift; discover uses 3 for live/validation failure. test and introspect also use 3 on live failure. serve --http --auth none off localhost exits 3.


Documentation

kjgpta.github.io/vectorsmith is the rendered manual (Material for MkDocs). Source is docs/.

I want to…

Go here

Get a tool working in five minutes

Getting started

Compare vector-store capabilities and support levels

Vector stores

See exactly what is tested per backend

Backend conformance

Understand every tools.yaml field

YAML reference

Plug into Claude, Codex, Cursor, LangChain, …

Integrations

Look up a CLI flag

CLI

See every extra, route, and exception

Library surface

Call tools from Python

Python API

JWT / tenancy / RBAC / credentials / audit

Enterprise

validate --enterprise at serve time

Security hardening

Traces, metrics, JSON logs, audit sinks

Observability

Embedders and rerank

Embedding providers

Helm / probes / Redis auth store

Kubernetes

Fix Desktop disconnect / env / HTTP auth

FAQ

Copy a host config

examples/mcp_hosts

See agent apps

examples/


Develop

uv sync
uv run ruff check .
uv run pytest -m "not conformance"
uv run lint-imports

# Full local backend matrix (Docker services required)
uv sync --group dev --group conformance --frozen
docker compose up -d
PYTHONPATH=packages/core:packages/cli:. \
  uv run pytest tests/conformance --backend all
docker compose down --volumes

Workspace: packages/core (vectorsmith_core, unpublished) · packages/cli (published vectorsmith). Core must not import the CLI.

Contributing · Support · Security · Changelog · Code of conduct


Apache-2.0 · LICENSE · NOTICE

Forge the tools. Keep the store.

Available Tools

7 tools
count_invoicesA

Count invoices matching optional client and status filters. Use when the user asks how many invoices there are.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientNo
statusNo

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations provided, the description must carry the burden of transparency. It implies a read-only operation (counting) but does not explicitly mention side effects, permissions, or edge cases. For a simple count, this is acceptable, but it could be more explicit about returning a numeric result.

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 concise and well-structured, consisting of two clear sentences with no unnecessary details or fluff. It efficiently conveys the purpose and usage.

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 there is no output schema, the description could benefit from stating the return type (e.g., an integer count). However, the phrase 'Count invoices' strongly implies a numeric result, making the tool's behavior sufficiently clear for typical use cases.

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?

The description adds minimal value beyond the input schema. It merely restates that client and status are optional filters, without explaining their exact semantics (e.g., how client is matched, whether status accepts multiple values). The schema already provides types and enums, so the description contributes little to parameter understanding.

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 that the tool counts invoices, and it explicitly says to use it when the user asks how many invoices exist. This effectively distinguishes it from sibling tools like search_invoices or get_invoice, which return detailed data rather than a count.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use this tool: 'Use when the user asks how many invoices there are.' It also mentions optional filters, implying it can be used with or without them, which clarifies its flexibility.

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

get_invoiceA

Fetch one invoice by invoice_id (for example INV-0001). Use when the user already has the invoice number.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoice_idYes

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It states the tool fetches one invoice, implying a read operation, but doesn't disclose details like whether it returns full details, error behavior for invalid IDs, or any rate limits. It's minimal but not misleading.

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, front-loaded with the action and parameter, and includes a usage hint. No wasted words.

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 single-parameter fetch tool with no output schema, the description is sufficient. It covers the purpose, parameter, and usage context. It could mention what happens if the invoice is not found, but that's a minor gap.

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 0%, but the description explains the invoice_id parameter with an example format (INV-0001), which adds value beyond the schema. However, it doesn't specify the expected format beyond the example, so it's adequate but not rich.

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 the tool fetches one invoice by invoice_id, with an example format (INV-0001). It distinguishes from siblings like search_invoices and list_overdue_invoices by specifying it's for a single known invoice.

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 explicitly says to use when the user already has the invoice number, which provides clear context. It doesn't explicitly mention alternatives, but the sibling names imply other tools for searching or listing, so the guidance is adequate.

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

list_available_toolsA

Live VectorSmith catalog from the current tools.yaml, including tools saved after this chat started. Claude Desktop freezes the named connector list at connect — call this before saying a tool is missing, then invoke with run_tool.

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?

With no annotations, the description carries the full burden of behavioral transparency. It discloses that the tool fetches live data from tools.yaml, including newly added tools, and warns about a frozen connector list. This conveys dynamic, read-only behavior without explicit side effects, which is sufficiently transparent for a list operation.

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 concise, consisting of two sentences that convey the tool's purpose, a key behavioral nuance, and a practical usage tip. There is no redundant information, and every sentence serves a clear function, making it well-structured and easy to parse.

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?

Given the simplicity of the operation (listing tools) and the absence of an output schema, the description provides sufficient context. It explains when to call the tool, what it returns (a live list), and why it matters (frozen connector list). This fully equips the user to understand and invoke 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?

The tool has no parameters, and the schema coverage is complete (100%). The description does not need to explain any parameters. Since no parameter information is added, the baseline score of 3 applies, indicating no additional semantic value provided beyond the schema.

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 that the tool provides a live list of available tools from the current tools.yaml, including tools added after the chat started. It explicitly distinguishes itself from sibling tools by focusing on enumeration of tools, making the purpose unmistakable.

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

Usage Guidelines5/5

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

The description gives explicit guidance on when to use this tool: 'call this before saying a tool is missing, then invoke with run_tool.' It also explains the context of Claude Desktop freezing the connector list, which clarifies why a live refresh is needed. This effectively directs the user to prefer this tool over alternatives in a specific scenario.

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

list_overdue_invoicesA

List overdue invoices only, optionally filtered by client or minimum amount. Use when the user asks which invoices are overdue or past due.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
clientNo
min_amountNo

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the read-only listing behavior and optional filters, but doesn't mention return format, pagination, or how 'overdue' is defined. For a simple list operation, this is adequate but sparse.

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: the first states the purpose and filters, the second gives the usage trigger. No unnecessary words, well-structured.

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

Completeness2/5

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

The tool is simple with 3 optional parameters, but the description only covers two of them, and there is no output schema or annotations. It lacks details about the 'limit' parameter and return structure, making the description incomplete for a fully informed invocation.

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 has 0% description coverage. The description mentions 'client' and 'minimum amount' but omits the 'limit' parameter entirely, and provides no additional semantic details about what 'client' refers to or how 'min_amount' is applied.

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?

Description states 'List overdue invoices only' – a specific verb and resource, and 'only' clearly scopes it to overdue invoices. This distinguishes it from siblings like search_invoices and search_paid_invoices by focusing on overdue status.

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?

Concludes with 'Use when the user asks which invoices are overdue or past due.' This provides a clear trigger for when to use the tool, but it doesn't explicitly list alternatives or 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.

run_toolA

Run any VectorSmith tool by name with its arguments from list_available_tools. Use this for tools added to tools.yaml after Claude connected; Desktop will not show those names in the connector list. Arguments are re-validated against that tool's compiled inputSchema (types, enums, limits); hidden static_filters and request tenancy still apply. Not a bypass.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTool name from list_available_tools
argumentsNoArguments for the named tool. Validated against that tool's compiled inputSchema, not this envelope.

TDQS

A3.8/5.0
Behavior4/5

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

Since there are no annotations, the description carries the full behavioral disclosure burden. It does well by revealing that arguments are re-validated against the target tool's compiled inputSchema, that hidden static_filters and request tenancy still apply, and explicitly asserting this is not a bypass. This adds valuable behavioral context beyond the schema, even if it does not cover side effects or failure modes.

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

Conciseness4/5

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

The description is compact—four sentences, each serving a distinct purpose: the essential action, the exact use-case, revalidation and constraints, and a caution against misuse. The most important information ('run by name', 'use for new tools') appears first, and no sentence is wasted.

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 description covers the main use case, tool login source, and revalidation constraints, which is good for a generic dispatcher. However, given there is no output schema or annotations, it does not explain what the returned result looks like or how errors from the target tool are presented, leaving room for the agent to ask follow-up questions.

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?

The schema already provides strong descriptions for both parameters: 'name' points to list_available_tools, and 'arguments' explains that validation happens against the target tool's inputSchema. The description adds a slight emphasis on re-validation and constraints, but overall the structured schema carries most of the parameter semantics, so a baseline 3 is appropriate.

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 states a clear verb and resource: 'Run any VectorSmith tool by name with its arguments from list_available_tools.' It clearly distinguishes this from the invoice-related sibling tools by presenting it as a generic dispatcher for tools not visible in the Desktop connector list. It is more specific than a tautology and provides enough scope to avoid confusion.

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 says when to use it: 'for tools added to tools.yaml after Claude connected; Desktop will not show those names in the connector list.' It also adds an important exclusion by stating 'Not a bypass' and noting that hidden filters still apply. However, it does not directly discuss using or avoiding sibling tools, though this generic dispatcher clearly does not conflict with them.

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

search_invoicesA

Search invoices by free text and filter by client, status, or amount. Use when the user asks about invoices, billing, or payments.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
clientNo
statusNo
min_amountNo

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavior, side effects, or permissions. It only says 'Search invoices,' implying a read operation, but gives no information about return format, pagination via limit, or any potential side effects. The description adds minimal behavioral context beyond the name and schema hints.

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 concise sentences: the first states the purpose and filters, the second gives usage context. There is no redundancy or fluff, and it is front-loaded with the core action. Every sentence earns its place.

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?

Given the tool has 5 optional parameters, no output schema, and no annotations, the description could be more thorough. It covers the main filters and usage context but lacks details on return format, pagination, and edge cases. The mention of 'Search invoices' implies a return, but without an output schema, the description should hint at the result type. It is adequate but not complete for an agent to use it without confusion.

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?

The schema coverage is 0% (no parameter descriptions), so the description should compensate. It mentions 'free text' (query), 'client', 'status', and 'amount' (likely min_amount), but omits the 'limit' parameter entirely. The mapping is partial; the description does not explain the exact meaning of min_amount or how the status filter works (e.g., multiple statuses selelectable). It adds some meaning but is incomplete.

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 the tool's action: 'Search invoices by free text and filter by client, status, or amount.' It identifies the resource (invoices) and the filtering capabilities, which distinguishes it from siblings like get_invoice (fetching specific) and list_overdue_invoices (specialized status). The verb 'search' plus the resource is 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?

It provides a clear usage context: 'Use when the user asks about invoices, billing, or payments.' This tells the agent when to invoke it, but it does not explicitly mention when NOT to use it or point to alternatives like list_overdue_invoices or search_paid_invoices, which are more specialized. Thus it lacks explicit exclutions and alternative guidance.

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

search_paid_invoicesA

Search invoices that are already paid, optionally by client or amount. Use when the user asks about paid invoices or completed payments.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
clientNo
min_amountNo

TDQS

A3.5/5.0
Behavior2/5

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 mentions the core function (searching paid invoices) but lacks details on read-only nature, pagination, default limits, or any side effects. The description adds little beyond the tool name itself.

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 concise sentences, front-loading the primary action and usage context. There is no fluff or redundant information, making it efficient and easily scannable.

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

Completeness2/5

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

The tool has 4 parameters, no output schema, and no annotations. The description is minimal, explaining only the basic purpose and two of four parameters. It does not mention what the return value looks like, the behavior of the 'query' parameter, or how the 'limit' applies, leaving significant gaps for an agent to correctly invoke the tool.

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 description coverage is 0%, so the description must compensate. It explains the semantics of 'client' (filter by client) and 'amount' (min_amount), but completely omits the 'query' and 'limit' parameters. This partial coverage leaves two parameters unexplained, making the description insufficient for proper usage.

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 the tool searches for paid invoices, using a specific verb and resource. It also distinguishes from sibling tools like search_invoices (which likely searches all invoices) by specifying 'already paid', 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.

Usage Guidelines4/5

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

The description explicitly says 'Use when the user asks about paid invoices or completed payments,' providing a clear context for when to invoke the tool. It does not mention when not to use it or alternatives, but the usage guidance is sufficiently clear.

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. Dates show when Glama detected each change.

  1. 1 tool updatev0.1.2
    • Changedrun_tool1 field changed
      • changedInput schema / properties / arguments / description
        Previous value: -"Arguments matching that tool's inputSchema"New value: +"Arguments for the named tool. Validated against that tool's compiled inputSchema, not this envelope."
  2. 7 tool updatesv0.1.0
    • First observedcount_invoices
    • First observedget_invoice
    • First observedlist_available_tools
    • First observedlist_overdue_invoices
    • First observedrun_tool
    • First observedsearch_invoices
    • First observedsearch_paid_invoices

TDQS

A3.8/5.0
Disambiguation2/5

search_invoices already supports status filters, making search_paid_invoices and list_overdue_invoices largely redundant subsets. count_invoices and get_invoice are distinct, but the boundary between generic search and these specialized list tools is unclear.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (search_invoices, get_invoice, list_overdue_invoices, run_tool, etc.). The naming style is uniform and predictable across both meta-tools and invoice tools.

Tool Count5/5

With 7 tools, the set is tightly scoped and neither bloated nor thin. Each tool has a reasonable place, even if some overlap in purpose.

Completeness4/5

The invoice surface covers search, get-by-ID, count, paid filtering, and overdue filtering, which handles common read/navigate tasks. Missing lifecycle tools like create/update are likely out of scope, but a plain list_invoices could have been useful.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI-powered generation of production-ready CTP (ConveniencePro Tool Protocol) tools from natural language descriptions, including tool definitions, implementations, tests, and TypeScript validation.
    5
    22
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Transforms OpenAPI definitions into MCP tools for seamless LLM-API integration.
    8
    26
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kjgpta/vectorsmith'

If you have feedback or need assistance with the MCP directory API, please join our Discord server