Skip to main content
Glama

VectorSmith

你的向量数据库,锻造成智能体真正能用的工具。

编写一个 tools.yaml。VectorSmith 会将其编译成带类型、带租户隔离的工具——然后你可以在 Python 中 import 它们,或通过 MCP serve 它们。

License Python 3.11+ TDS MCP Docs

它是什么 · 工作原理 · 编写 YAML · Python · Claude / Codex / Cursor · 试试看 · 文档


为什么存在

与你的发票、工单或目录对话的智能体,通常只能得到两个糟糕的选项:

典型做法

问题所在

厂商 MCP(Qdrant / Pinecone / …)

集群管理工具。upsert、delete、create-collection。模型可能乱跑。

手工将 JSON schema 绑定到 LangChain / OpenAI SDK

你得在 Python 里重新实现过滤器、限制和租户隔离。每个智能体都复制一遍。

“直接在系统提示词里嵌入并 search()”

没有类型化参数。没有枚举。没有隐藏的 tenant = acme。

VectorSmith 是第三个选项:数据存储仍然是你的。工具是一份 YAML 契约。 编译器将该契约转换为 MCP schema 或进程内工具。智能体永远看不到 URL、API 密钥或租户过滤器。

  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

工作原理

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

一个文件,两个入口。同一套编译后的工具。

Python 应用

聊天 / IDE 宿主

安装

pip install "vectorsmith[qdrant,langchain]"

pip install "vectorsmith[qdrant]" 这样 vectorsmith 就在 PATH 上

调用

from vectorsmith import load_tools

vectorsmith serve tools.yaml --name invoices

进程

进程内。无子进程。

宿主派生 CLI(MCP stdio 或 HTTP)

混入

你的 @tool + 通过 MCP 客户端的 Slack/GitHub

其他 mcpServers 键就放在它旁边

你不需要导入执行器。你不需要把 inputSchema 复制到 LLM SDK 中。


编写工具而非提示词

一个工具包含:名称、描述(让模型选择它)、集合、可选的文本搜索、模型可以传递的参数,以及模型绝不能看到的过滤器:

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 会写入一个入门文件。完整字段列表——种类、运算符、流水线、内置项、每个后端——见 docs/tools-yaml-reference.md。

模型看到的内容

{
  "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 不在该 schema 中。引擎在每次调用时都会将其 AND 进去。凭据永远不会离开 connections。

你可以声明的种类

kind

用途

典型工具

search

语义检索 + 过滤器

search_invoices

lookup

精确 id,限制 1

get_invoice

count

“有多少逾期?”

count_invoices

scroll

过滤 / 分页,无 ANN

列表式工具

pipeline

检索 → post_filter / group_by / sort / project

每个客户前 N 条

内置项(search_<connection>、get_<connection>_by_id 等)在连接上是可选启用的。如果你已经用相同名称命名了用户工具,就把它们关掉。


在你的智能体中(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()

同一份 YAML,其他技术栈:

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

附加项

导入

vectorsmith[langchain]

from vectorsmith import load_tools

vectorsmith[langgraph]

相同工具;LangGraph 图

vectorsmith[openai-agents]

from vectorsmith.openai_agents import load_tools

vectorsmith[anthropic]

from vectorsmith.anthropic import load_tools

可运行的示例应用:examples/langchain_agent · langgraph_agent · openai_agents · anthropic_agent。


在 Claude、Codex、Cursor 中

这些产品无法 import vectorsmith。它们会派生一个进程。让它们指向 serve,使用同一份 YAML。

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

Codex 使用 TOML(~/.codex/config.toml),不是 JSON。Claude Code 使用 .mcp.json——它不会读取 Desktop 配置文件。

宿主

配置

指南

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

可直接复制的片段:examples/mcp_hosts/。Slack、GitHub、文件系统保持为独立服务器——共存。


存储

连接上的 backend 是六个内置适配器之一。完整矩阵(附加项、混合检索、嵌套路径):向量存储。

qdrant · pgvector · chroma · pinecone · weaviate · milvus

pgvector 可以表模式运行(无向量列),用于 lookup / count / scroll。混合检索按能力门控(Qdrant / Weaviate / Milvus / Pinecone),并用 validate --live 检查。


试试看

发票示例是一个 tools.yaml 加一个环境变量文件。复制 .env.example 并在 validate / test / serve 之前将 QDRANT_URL 设置为你的集群。

# 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

工单是第二个文件 / 第二个 MCP 名称:tools.tickets.yaml → --name tickets。

示例演练


CLI

命令

作用

init

写入入门 tools.yaml + .env.example

validate

编译 + lint。--live 会 ping 存储。--strict 在警告时失败

test

不启动服务,直接调用一个编译后的工具

serve

MCP stdio(Desktop / Codex / Cursor;--watch 默认开启)或 --http HOST:PORT(无 watch)。默认 HTTP --auth 为 builtin(需要 https --public-url)。本地 HTTP:--auth none。

introspect

将集合 / 字段元数据输出到 --out(默认 schema.json)。需要 --connection。

drafts / approve

drafts list|reject NAME。approve NAME [--file tools.yaml] 将其提升到该文件中。草稿存放在 ./tools.drafts.yaml(进程工作目录)。

auth

内置 HTTP OAuth 的 rotate-secret | revoke

validate 退出码为 0 / 1(--strict 警告)/ 2(错误)。test 和 introspect 在实时失败时使用 3。serve --http --auth none 在非 localhost 上退出码为 3。


文档

kjgpta.github.io/vectorsmith 是渲染后的手册(Material for MkDocs)。源码在 docs/。

我想……

前往这里

五分钟内让一个工具跑起来

快速入门

看看内置了哪些向量存储

向量存储

理解 tools.yaml 的每个字段

YAML 参考

接入 Claude、Codex、Cursor、LangChain 等

集成

查一个 CLI 标志

CLI

从 Python 调用工具

Python API

解决 Desktop 断连 / 环境变量 / HTTP 认证

FAQ

复制一份宿主配置

examples/mcp_hosts

查看智能体应用

examples/


开发

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

工作区:packages/core(vectorsmith_core,未发布)· packages/cli(已发布 vectorsmith)。Core 不得导入 CLI。

参与贡献 · 支持 · 安全 · 更新日志 · 行为准则


Apache-2.0 · LICENSE · NOTICE

锻造工具。守住存储。

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

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Transforms OpenAPI definitions into MCP tools for seamless LLM-API integration.
    8
    16 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