Skip to main content
Glama

VectorSmith

Deine Vektordatenbank, geschmiedet zu Werkzeugen, die ein Agent tatsächlich nutzen kann.

Schreibe eine tools.yaml. VectorSmith kompiliert sie in typisierte, mandantengeschützte Werkzeuge – dann kannst du sie entweder in Python importieren oder über MCP serven.

License Python 3.11+ TDS MCP Docs

Was es ist · So funktioniert es · YAML schreiben · Python · Claude / Codex / Cursor · Ausprobieren · Dokumentation


Warum es das gibt

Agenten, die mit deinen Rechnungen, Tickets oder Katalogen sprechen, bekommen normalerweise eine von zwei schlechten Optionen:

Typischer Ansatz

Was schiefgeht

Anbieter-MCP (Qdrant / Pinecone / …)

Cluster-Admin-Tools. Upsert, Delete, Create-Collection. Das Modell kann umherirren.

JSON-Schemas von Hand an LangChain / das OpenAI SDK binden

Du implementierst Filter, Limits und Mandantenisolation in Python neu. Jeder Agent kopiert es.

„Einfach einbetten und search() im System-Prompt“

Keine typisierten Argumente. Keine Enums. Kein verstecktes tenant = acme.

VectorSmith ist die dritte Option: Der Datenspeicher bleibt deiner. Die Werkzeuge sind ein YAML-Vertrag. Der Compiler verwandelt diesen Vertrag in MCP-Schemas oder In-Process-Werkzeuge. Der Agent sieht nie die URL, den API-Schlüssel oder den Mandanten-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: @cubicecho/graphql-mcp

So funktioniert's

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

Eine Datei, zwei Türen. Gleiche kompilierte Werkzeuge.

Python-App

Chat-/IDE-Host

Installieren

pip install "vectorsmith[qdrant,langchain]"

pip install "vectorsmith[qdrant]" damit vectorsmith auf dem PATH ist

Aufrufen

from vectorsmith import load_tools

vectorsmith serve tools.yaml --name invoices

Prozess

In-Process. Kein Subprozess.

Der Host startet die CLI (MCP stdio oder HTTP)

Einbinden

Deine @tools + Slack/GitHub über einen MCP-Client

Andere mcpServers-Schlüssel liegen daneben

Du importierst keinen Executor. Du kopierst inputSchema nicht in das LLM-SDK.


Ein Werkzeug schreiben, nicht einen Prompt

Ein Werkzeug ist ein Name, eine Beschreibung (damit das Modell es auswählt), eine Sammlung, optionale Textsuche, Parameter die das Modell übergeben darf, und Filter, die es niemals sehen darf:

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 schreibt eine Startdatei. Die vollständige Feldliste – Arten, Operatoren, Pipelines, Built-ins, jedes Backend – steht in docs/tools-yaml-reference.md.

Was das Modell sieht

{
  "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 ist nicht in diesem Schema. Die Engine verknüpft es bei jedem Aufruf per UND. Anmeldedaten verlassen connections nie.

Arten, die du deklarieren kannst

kind

Wofür

Typisches Werkzeug

search

Semantisches Abrufen + Filter

search_invoices

lookup

Exakte ID, Limit 1

get_invoice

count

„Wie viele überfällig?“

count_invoices

scroll

Filtern / Seiten, kein ANN

Listenartige Werkzeuge

pipeline

Abrufen → post_filter / group_by / sort / project

Top-N pro Kunde

Built-ins (search_<connection>, get_<connection>_by_id, …) sind opt-in auf der Verbindung. Schalte sie ab, wenn du bereits ein Benutzerwerkzeug mit demselben Namen benannt hast.


In deinem Agenten (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()

Gleiches YAML, andere 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", {…})

Zusätzlich

Import

vectorsmith[langchain]

from vectorsmith import load_tools

vectorsmith[langgraph]

gleiche Werkzeuge; LangGraph-Graph

vectorsmith[openai-agents]

from vectorsmith.openai_agents import load_tools

vectorsmith[anthropic]

from vectorsmith.anthropic import load_tools

Funktionierende Apps: examples/langchain_agent · langgraph_agent · openai_agents · anthropic_agent.


In Claude, Codex, Cursor

Diese Produkte können vectorsmith nicht importieren. Sie starten einen Prozess. Richte sie auf serve mit der gleichen YAML aus.

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

Codex ist TOML (~/.codex/config.toml), nicht JSON. Claude Code verwendet .mcp.json – es liest nicht die Desktop-Datei.

Host

Konfiguration

Anleitung

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, Dateisystem bleiben getrennte Server – Koexistenz.


Speicher

backend auf einer Verbindung ist einer von sechs mitgelieferten Adaptern. Vollständige Matrix (Extras, Hybrid, verschachtelte Pfade): Vektor-Speicher.

qdrant · pgvector · chroma · pinecone · weaviate · milvus

pgvector kann im Tabellenmodus (ohne Vektor-Spalte) für Lookup / Count / Scroll laufen. Hybride Suche ist fähigkeitsbasiert (Qdrant / Weaviate / Milvus / Pinecone) und wird mit validate --live geprüft.


Ausprobieren

Das Rechnungs-Beispiel ist eine tools.yaml plus eine Env-Datei. Kopiere .env.example und setze QDRANT_URL auf deinen Cluster, bevor du validate / test / serve ausführst.

# 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 sind eine zweite Datei / ein zweiter MCP-Name: tools.tickets.yaml → --name tickets.

Beispiel-Durchlauf


CLI

Befehl

Funktion

init

Schreibt eine Start-tools.yaml + .env.example

validate

Kompilieren + Linten. --live pingt den Speicher an. --strict schlägt bei Warnungen fehl

test

Ein kompiliertes Werkzeug aufrufen, ohne zu serven

serve

MCP stdio (Desktop / Codex / Cursor; --watch standardmäßig aktiv) oder --http HOST:PORT (kein Watch). Standard-HTTP---auth ist builtin (benötigt https --public-url). Localhost-HTTP: --auth none.

introspect

Sammlungs-/Feld-Metadaten nach --out (Standard schema.json). Erfordert --connection.

drafts / approve

drafts list|reject NAME. approve NAME [--file tools.yaml] übernimmt in diese Datei. Entwürfe liegen in ./tools.drafts.yaml (Prozess-CWD).

auth

rotate-secret | revoke für eingebautes HTTP-OAuth

validate beendet mit 0 / 1 (--strict-Warnungen) / 2 (Fehler). test und introspect verwenden 3 bei einem Live-Fehler. serve --http --auth none außerhalb von localhost beendet mit 3.


Dokumentation

kjgpta.github.io/vectorsmith ist das gerenderte Handbuch (Material for MkDocs). Quelle ist docs/.

Ich möchte…

Gehe hierhin

Ein Werkzeug in fünf Minuten zum Laufen bringen

Erste Schritte

Sehen, welche Vector-Stores mitgeliefert werden

Vector-Speicher

Jedes tools.yaml-Feld verstehen

YAML-Referenz

In Claude, Codex, Cursor, LangChain, … einbinden

Integrationen

Einen CLI-Flag nachschlagen

CLI

Werkzeuge aus Python aufrufen

Python-API

Desktop-Verbindungsproblem / Env / HTTP-Auth beheben

FAQ

Eine Host-Konfiguration kopieren

examples/mcp_hosts

Agenten-Apps sehen

examples/


Entwickeln

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

Arbeitsbereich: packages/core (vectorsmith_core, unveröffentlicht) · packages/cli (veröffentlicht vectorsmith). Core darf die CLI nicht importieren.

Mitwirken · Support · Sicherheit · Changelog · Verhaltenskodex


Apache-2.0 · LICENSE · NOTICE

Schmiede die Werkzeuge. Behalte den 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.

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.

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.

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.

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.

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.

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.

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.

  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.9/5.0

Scored across 7 tools

Disambiguation3/5

get_invoice, count_invoices, and the meta discovery/execution tools are distinct, though run_tool is a catch-all that could execute any of the invoice tools. The real ambiguity is that search_invoices already supports status filtering, making search_paid_invoices and list_overdue_invoices overlapping subsets. The use-when guidance helps, but an agent could reasonably pick either general or specialized tools for paid/overdue queries.

Naming Consistency5/5

All tool names follow a predictable snake_case verb_noun pattern: search_invoices, get_invoice, count_invoices, list_overdue_invoices, search_paid_invoices, run_tool, and list_available_tools. The meta tools do not break the convention, so naming is consistent across the set.

Tool Count5/5

Seven tools is well within the ideal scope, with two infrastructure tools for dynamic discovery/execution and five read-only invoice tools. Each tool has a reasonable purpose, and the count does not feel bloated or thin.

Completeness4/5

The read-only invoice workflow is well covered: search, get by ID, count, overdue list, and paid search. It lacks create/update/delete operations and an explicit 'list all invoices' tool, but search with filters can work around the latter, and the descriptions imply a query/reporting focus.

Maintenance

ActivitySlowing
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Transforms OpenAPI definitions into MCP tools for seamless LLM-API integration.
    8
    29 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Compiles YAML adapters or OpenAPI specs into a minimal MCP tool surface that exposes only declared capabilities to agents, with risk-tiered execution, human approval queues, credential brokering, prompt-injection sanitising and NIST AU-3 audit logging. This lets operators put scoped identity, permissions and kill switches in front of any API so agents can call exactly the tools they need and nothing more.
    3
    MIT