Skip to main content
Glama
infino-ai

Infino MCP server

Official
by infino-ai

Infino MCP server

npm MCP Registry License: Apache-2.0

An MCP server for Infino — it lets an AI agent run keyword, semantic, hybrid, and SQL retrieval over your data on object storage — the retrieval layer for RAG, persistent agent memory, and search over your own files — from any MCP-compatible client (Claude Code, Claude Desktop, Cursor, VS Code, and others). Published on npm as @infino-ai/mcp-server and listed on the official MCP Registry as io.github.infino-ai/mcp-server (which propagates to catalogs like Smithery, Glama, and PulseMCP).

  • Local embeddings, no key. Semantic search embeds queries with a local model — nothing leaves the machine for embedding.

  • The agent owns the data. Every tool, writes included, is always available. On Infino Cloud the API key's capabilities decide what a connection may do; every tool carries MCP annotations so your client can ask before a destructive call.

  • Local or hosted. Point it at a local path, your own bucket (S3, Azure, or any S3-compatible store), or a hosted Infino Cloud endpoint with an API key.

  • The index is a valid Parquet file. A table stores the data and its search indexes in plain Parquet on the storage — open the same file with DuckDB or pyarrow. No export, no lock-in.


Contents


Related MCP server: ClawMem MCP Server

Requirements

  • Node.js ≥ 20 (the server runs as a Node process over stdio).

  • An MCP-compatible client (Claude Code, Claude Desktop, Cursor, VS Code, …).

  • Data reachable by Infino — a local directory, a bucket with credentials available in the environment, or a hosted Infino Cloud endpoint with an API key (see Storage backends).

  • On first run the server downloads the local embedding model (~90 MB) once and caches it; subsequent runs are offline for embedding.


Quick start

The server is launched by your MCP client over stdio — you don't run it directly in normal use. Every client config follows the same shape: command npx -y @infino-ai/mcp-server, with configuration supplied via environment variables. Set INFINO_MCP_URI to the data you want to serve — a local path or a bucket URI. If it's omitted, the server uses a durable per-user directory (~/.infino/mcp) so data persists across restarts; point INFINO_MCP_URI at your own path or bucket to serve existing data.

{
  "command": "npx",
  "args": ["-y", "@infino-ai/mcp-server"],
  "env": {
    "INFINO_MCP_URI": "/Users/me/.infino/memory"
  }
}

To serve a hosted Infino Cloud database instead, point INFINO_MCP_URI at the https://<host>/<database> endpoint and supply your API key. Everything else is identical:

{
  "command": "npx",
  "args": ["-y", "@infino-ai/mcp-server"],
  "env": {
    "INFINO_MCP_URI": "https://api.platform.infino.ws/my-database",
    "INFINO_API_KEY": "inf_…"
  }
}

The sections below show the exact place each client expects this block.


Claude Code plugin (one-step install)

For Claude Code, this repo is also a plugin marketplace. Installing the plugin wires up the MCP server plus a how-to-use skill and an /infino-search command in one step — no JSON to edit. Inside Claude Code:

/plugin marketplace add infino-ai/infino-mcp
/plugin install infino@infino-ai

On enable you'll be prompted for your Infino data URI (INFINO_MCP_URI) and, for Infino Cloud, your API key. That's it: the infino_* tools, the using-infino skill, and /infino-search <query> are then available. (Other clients: use the Client setup configs below.)


Client setup

Claude Code

Add the server with the CLI. Use --scope user to make it available in every project, or --scope project to commit it to the repo (writes a shared .mcp.json); the default scope is local (this project only).

claude mcp add infino \
  --scope user \
  -e INFINO_MCP_URI=/Users/me/.infino/memory \
  -- npx -y @infino-ai/mcp-server

Add more knobs with repeated -e flags, e.g. -e INFINO_MCP_VALIDATE=true. Verify with:

claude mcp list
claude mcp get infino

Claude Desktop

Edit the configuration file (create it if it doesn't exist), then fully restart Claude Desktop.

OS

Path

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "infino": {
      "command": "npx",
      "args": ["-y", "@infino-ai/mcp-server"],
      "env": {
        "INFINO_MCP_URI": "/Users/me/.infino/memory"
      }
    }
  }
}

Cursor

Add the server to ~/.cursor/mcp.json (available in all projects) or <project>/.cursor/mcp.json (this project only), then reload. The format matches Claude Desktop:

{
  "mcpServers": {
    "infino": {
      "command": "npx",
      "args": ["-y", "@infino-ai/mcp-server"],
      "env": {
        "INFINO_MCP_URI": "/Users/me/.infino/memory"
      }
    }
  }
}

VS Code

VS Code (1.102+) reads MCP servers from .vscode/mcp.json in the workspace (or your user mcp.json via the command palette → MCP: Open User Configuration). Note the top-level key is servers and each entry declares "type": "stdio":

{
  "servers": {
    "infino": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@infino-ai/mcp-server"],
      "env": {
        "INFINO_MCP_URI": "/Users/me/.infino/memory"
      }
    }
  }
}

Other MCP clients

Any client that speaks MCP over stdio works. Configure it to launch:

command: npx
args:    -y @infino-ai/mcp-server
env:     INFINO_MCP_URI=<path-or-bucket-uri>   (plus any options below)

Logs are written to stderr so they never corrupt the JSON-RPC stream on stdout — point your client's log capture there when debugging.


Configuration

All configuration is via environment variables — there are no config files and no command-line flags to manage.

Environment variables

Variable

Required

Default

Description

INFINO_MCP_URI

No

~/.infino/mcp (persistent)

Data to serve: a local path (/Users/me/.infino/memory), a bucket URI (s3://…, az://…), or a hosted endpoint (https://<host>/<database>, Infino Cloud). If unset, a durable per-user directory (~/.infino/mcp) is used so data persists across restarts; it falls back to an ephemeral in-process catalog (memory://) only if that directory can't be created.

INFINO_API_KEY

With a hosted URI

API key (inf_…) for a hosted https:// endpoint. Required when INFINO_MCP_URI is an https:// URI; ignored for local and object-storage connections.

INFINO_MCP_EMBED_PROVIDER

No

local

Embedding provider: local (Hugging Face transformers.js, no key, nothing leaves the machine) or openai (any OpenAI-compatible /embeddings endpoint — OpenAI, Azure OpenAI's /openai/v1 surface, or a compatible server). Inferred as openai when INFINO_MCP_EMBED_BASE_URL is set.

INFINO_MCP_EMBED_BASE_URL

With openai

Base URL of the OpenAI-compatible embeddings API, e.g. https://api.openai.com/v1 or https://<resource>.openai.azure.com/openai/v1. The server POSTs to <base>/embeddings.

INFINO_MCP_EMBED_API_KEY

No

API key for the openai provider. Sent as both Authorization: Bearer and api-key, so one value works for OpenAI and Azure OpenAI. Omit to call an unauthenticated or ambient-identity endpoint.

INFINO_MCP_EMBED_MODEL

No

Xenova/all-MiniLM-L6-v2 (local) · text-embedding-3-small (openai)

The embedding model. For local, a Hugging Face feature-extraction model; for openai, the model/deployment name. Must match the model that produced the table's stored vectors — and therefore its vector-index dimension (e.g. text-embedding-3-small is 1536-dim; the default local model is 384-dim).

INFINO_MCP_VALIDATE

No

off

When set (1/true/yes), probes the object store at startup so bad credentials or an unreachable bucket fail then instead of on the first search.

Cloud credentials are read from the standard provider environment variables — the server maps them to the store's config and introduces no credential vars of its own. Omit them entirely to use ambient cloud identity (an IAM instance role or Azure managed identity).

Serving a catalog embedded with OpenAI / Azure OpenAI. If your tables were vectorized with a hosted embedding model rather than the local default, point the server at that same model so query and document vectors align:

"env": {
  "INFINO_MCP_URI": "s3://my-bucket/infino",
  "INFINO_MCP_EMBED_PROVIDER": "openai",
  "INFINO_MCP_EMBED_BASE_URL": "https://my-resource.openai.azure.com/openai/v1",
  "INFINO_MCP_EMBED_API_KEY": "…",
  "INFINO_MCP_EMBED_MODEL": "text-embedding-3-small"
}

The model must match what produced the stored vectors — a mismatch yields meaningless similarity or a dimension error. Keyword and SQL search are unaffected by the embedder.

Backend

Credentials

AWS S3

AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY (+ AWS_SESSION_TOKEN, AWS_REGION if used)

S3-compatible (R2/MinIO/B2)

AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_ENDPOINT_URL

Azure Blob

AZURE_STORAGE_ACCOUNT, AZURE_STORAGE_KEY

Infino Cloud (hosted)

INFINO_API_KEY — no object-storage credentials needed (the platform owns the storage)

Storage backends

// Local directory
"env": { "INFINO_MCP_URI": "/Users/me/.infino/memory" }

// AWS S3 — ambient AWS_* credentials, default endpoint
"env": {
  "INFINO_MCP_URI": "s3://my-bucket/infino",
  "AWS_ACCESS_KEY_ID": "…",
  "AWS_SECRET_ACCESS_KEY": "…"
}

// S3-compatible (Cloudflare R2 / MinIO / Backblaze B2) — custom endpoint
"env": {
  "INFINO_MCP_URI": "s3://my-bucket/infino",
  "AWS_ENDPOINT_URL": "https://<account>.r2.cloudflarestorage.com",
  "AWS_ACCESS_KEY_ID": "…",
  "AWS_SECRET_ACCESS_KEY": "…"
}

// Azure Blob
"env": {
  "INFINO_MCP_URI": "az://my-container/infino",
  "AZURE_STORAGE_ACCOUNT": "…",
  "AZURE_STORAGE_KEY": "…"
}

// Infino Cloud (hosted) — the database is the last path segment
"env": {
  "INFINO_MCP_URI": "https://api.platform.infino.ws/my-database",
  "INFINO_API_KEY": "inf_…"
}

On a hosted connection the search, SQL, and write tools all behave exactly as they do locally — the only difference is where the data lives. Compaction and garbage collection are handled server-side, so they are not exposed as client operations. Note that semantic and hybrid search still embed queries locally in this server, so INFINO_MCP_EMBED_MODEL must match the model that produced the hosted table's stored vectors (see the OpenAI / Azure OpenAI note above) — this matters especially when someone else ingested the data.


Tools

Tool

Arguments

What it does

infino_semantic_search

table, query, k, column?, vectorColumn?, columns?, filter?

Find passages by meaning — embeds the query with a local model (no key) and ranks by vector similarity. Handles paraphrase and synonyms. score is a distance (lower is closer). Optional filter ({column, query, mode?}) restricts the ranking to rows whose keyword column matches first (a pushdown pre-filter). Optional columns chooses which fields each hit returns (e.g. a path + line range to cite); defaults to the text column, with _id and score always included.

infino_keyword_search

table, query, k, column?, mode?, stats?, columns?

BM25 full-text search — for exact terms, identifiers, error codes, product names. score is a relevance (higher is better). mode is or (default) or and; stats is per_superfile (default) or global for one table-wide idf.

infino_hybrid_search

table, query, k, column?, vectorColumn?, mode?, columns?

Fused keyword + semantic search in one ranking pass — BM25 over the text column combined with vector similarity, so rows matching the literal terms and the meaning rank highest. score is the fused rank (higher is better).

infino_token_match

table, query, column?, mode?, limit?

Unranked keyword filter — the set of rows whose text column contains the token(s). Use when you need the matches, not a relevance order.

infino_exact_match

table, value, column?, limit?

Unranked exact-equality filter over an indexed column (tag, status, id string).

infino_count

table, query, column?, mode?

Count how many rows match a keyword query, without fetching them — a fast tally over the text column. For the matching rows use infino_keyword_search or infino_token_match.

infino_sql

query, embed?

SQL for counts, filters, joins, aggregates. The engine's search table functions are callable inside it; a {{name}} placeholder is filled with the vector of embed[name]. Any single statement, DDL/DML included.

infino_list_tables

List the tables in the connected catalog.

infino_describe_table

table

Column names and types for a table.

infino_create_database

Provision the database the connection names (Infino Cloud); a no-op success locally. Idempotent.

infino_create_table

table, columns, fts?, vector?

Create a table from a {column: type} descriptor. Full-text indexes on fts (default: every large_utf8 column). vector: true adds an embedding column sized to the server's embedder, with a cosine index.

infino_drop_table

table, purge?

Drop a table and, by default, delete its storage objects; purge: false only unregisters the name.

infino_add_documents

table, documents

Append rows (one call = one commit). Rows without a vector are embedded from the text column, all in one batch; the result reports appended and embedded. A key that is not a column is an error.

infino_update_documents

table, predicate, documents

Replace the rows matching a SQL predicate with new documents, 1:1 (missing vectors are embedded). Durable storage only.

infino_delete_documents

table, predicate

Delete the rows matching a SQL predicate. Durable storage only.

Search hits return full column values — the columns argument is a projection passed straight to the engine (embedded or hosted), so any column in the table can come back with each hit: ["id"] for compact hits at a large k, ["id", "text"] for the full text alongside an id to cite, metadata columns for filtering. It defaults to the text column, with _id and score always included, and nothing is ever truncated; to keep results small, project fewer columns or ask for a smaller k. Every search response also carries score_kind, stating whether its score is a distance (semantic: lower is closer) or a relevance (keyword and hybrid: higher is better).

For plain retrieval prefer the dedicated search tools, which embed and project for you. infino_sql is for filters, joins, and aggregates, including over a search table function's results, so one query can rank and aggregate at once.

Writing data

The write path an agent follows, each step one tool call and one commit:

  1. infino_create_database if a hosted database answers 404.

  2. infino_create_table with a utf8 key column, large_utf8 text columns, and vector: true for semantic search. The server sizes the vector column to its embedder; the agent never types a dimension. Keep the result: its indexes field is the only record of which columns are indexed.

  3. infino_add_documents, tens of rows per call, always including the key. Missing vectors are embedded in one batch.

  4. To replace rows, infino_delete_documents by key predicate, then add again. To remove rows, check the predicate with infino_count first.

A tool call carries tens of documents. For a whole corpus, use the infino CLI (infino ingest takes Parquet or NDJSON against the same URI) or an SDK. The CLI is bring-your-own-vectors like the engine, so include the embedding column in the rows or load text and search by keyword.

There is no server-side write gate, and the retired INFINO_MCP_ENABLE_WRITES variable is ignored (the server says so on stderr if it is set). On Infino Cloud the API key's capabilities bound what the connection may do: a read-scoped key is refused every write, and the tool result says to mint one with write capability. Locally, point the server only at data the agent may change.


Security & data handling

This server runs locally, beside the client, and keeps data and credentials on the user's machine.

  • Local execution, no inbound listener. It runs as a subprocess of your MCP client over stdio and opens no network listener. In the default local/bucket mode it contacts no remote service. When INFINO_MCP_URI is a hosted https:// endpoint, it makes outbound TLS calls to that endpoint to serve searches, SQL, and (if enabled) writes — so the data in those requests reaches the hosted service you configured, and nothing else.

  • No data sent for embedding, by default. With the default provider, query and document embedding uses a local model, so text is never sent to a third-party embedding API and there is no embedding API key to provision or leak. In hosted mode only the resulting vector, not the text, reaches the Infino Cloud endpoint. If you configure the OpenAI-compatible provider, the text being embedded is sent to the endpoint you name.

  • Credentials stay in the environment. Storage credentials (AWS_*/AZURE_*) and the hosted API key (INFINO_API_KEY) are read from environment variables and used only to reach the store or endpoint you configured. They are never logged or returned in tool output.

  • Who can write is decided outside the server. The full toolset, writes included, is always available to the agent. On Infino Cloud the API key's capabilities bound what the connection may do (a read-scoped key is refused every write). Locally, point the server only at data the agent may change. Every tool carries MCP annotations (readOnlyHint, destructiveHint) so your client can ask for confirmation on its own terms.

  • Least privilege. Point INFINO_MCP_URI at the narrowest dataset the task needs, and supply storage credentials scoped to that bucket/prefix.


How retrieval works

Semantic search embeds locally with Hugging Face transformers.js (all-MiniLM-L6-v2, 384-dim by default; override with INFINO_MCP_EMBED_MODEL). The server embeds both the documents it ingests (via infino_add_documents) and your queries with the same model, so they align in the same vector space.

If you change INFINO_MCP_EMBED_MODEL, the table's vector index must match the new model's dimension — embeddings produced by different models are not comparable, and a dimension mismatch will fail at search time.


Troubleshooting

Symptom

Likely cause / fix

Client shows no Infino tools

Server didn't start — check the client's MCP logs (stderr). Confirm npx is on PATH and INFINO_MCP_URI is set. Fully restart the client after editing config.

INFINO_MCP_URI is required

The env var isn't reaching the subprocess. In GUI clients, env must be inside the server's env block (the process won't inherit your shell).

A write says the key "was rejected or lacks write capability"

On Infino Cloud the API key is read-scoped (HTTP 403) or wrong. Mint a key with write capability and restart the server with it.

A write says "another writer won the commit race"

Two writers hit the same table at once and this call did not land. Reissue it.

Slow first query

One-time embedding-model download (~90 MB). Subsequent runs use the cache.

Auth error against a hosted https:// URI

INFINO_API_KEY is missing, wrong, or lacks access to that database. Confirm the key (inf_…) and that the URI's last path segment is a database you can reach.

Dimension / vector errors on semantic search

The table's vector index doesn't match the embedding model's dimension. Re-ingest, or set INFINO_MCP_EMBED_MODEL to the model the index was built with.


Local development

The server depends on the published @infino-ai/infino Node binding, which resolves from public npm like any other dependency.

npm install
npm run build
INFINO_MCP_URI=/path/to/data node dist/index.js   # runs on stdio

Point a client at node /absolute/path/dist/index.js over stdio to dogfood a local build, or use the MCP Inspector:

npx @modelcontextprotocol/inspector node dist/index.js

License

Apache-2.0

Available Tools

15 tools
infino_add_documentsAdd documents to an Infino tableA

Append documents (rows, as JSON objects keyed by column name) to a table; one call is one commit. If the table has a vector index and a document omits the vector, the server embeds its text column (a local model, no API key). Send tens of rows per call; for a whole corpus use the infino CLI or an SDK.

ParametersJSON Schema
NameRequiredDescriptionDefault
tableYesTable to append to.
documentsYesRows to append, as JSON objects keyed by column name.

TDQS

A4.4/5.0
Behavior4/5

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

The description adds useful behavioral context beyond the annotations: 'one call is one commit' and the vector-index embedding fallback with a local model and no API key. It does not cover response format or failure behavior, but the most important behavioral traits are disclosed.

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 three sentences with no filler. The main action and data format are front-loaded, followed by the commit/embedding behavior and batching alternative. Every sentence earns its place.

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

Completeness4/5

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

For a two-parameter write tool, the description covers the key invocation details: required parameters, document format, batch sizing, commit semantics, and vector embedding behavior. It omits output/response expectations, but since there is no output schema and this is an append operation, that is a minor gap.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaningful extra semantics by explaining that omitting the vector field triggers server-side embedding from the text column, and by advising row counts per call. This goes beyond the schema's simple 'Rows to append' phrasing.

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

Purpose5/5

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

The description states a specific action ('Append documents'), a clear resource ('to a table'), and the data shape ('rows, as JSON objects keyed by column name'). This clearly distinguishes the tool from the update/delete siblings by framing the operation as append-only.

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

Usage Guidelines4/5

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

It gives explicit batching guidance ('Send tens of rows per call') and an explicit alternative for larger volumes ('for a whole corpus use the infino CLI or an SDK'). It does not explicitly contrast with infino_update_documents or infino_delete_documents, but 'append' makes that distinction reasonably clear.

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

infino_countCount keyword matchesA
Read-onlyIdempotent

Use when you only need HOW MANY rows match a keyword query, not the rows themselves — a fast tally over a text column, without fetching or ranking. Cheaper than infino_keyword_search when a number is all you need (e.g. 'how many docs mention X'). For the matching rows use infino_keyword_search or infino_token_match.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoMatch any token ('or', the default) or every token ('and').
queryYesQuery terms, matched as literal tokens.
tableYesTable to search.
columnNoText column to search; inferred from the table schema when omitted.

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the readOnly/idempotent annotations, the description adds non-obvious behavioral context: it is a 'fast tally... without fetching or ranking' and is cheaper than the search sibling. It does not detail the exact result shape, but 'HOW MANY rows' makes the count-only output clear.

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

Conciseness5/5

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

The description is two tight sentences with the core use case front-loaded. Every clause earns its place: the count-only purpose, the non-fetch behavior, the cost comparison, and the sibling routing.

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

Completeness5/5

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

For a simple count tool with strong annotations and fully described schema, the description covers use case, intended result, cost/performance characteristics, and alternative tools. The absence of an output schema is mitigated by the explicit 'HOW MANY rows' statement.

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 100%, and the schema already explains all parameters including mode, query token matching, table, and inferred column. The free-text description adds little parameter-specific meaning, so the baseline score applies.

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 names the operation and return intent: 'HOW MANY rows match a keyword query' over a text column. It explicitly distinguishes itself from infino_keyword_search and infino_token_match, so an agent can identify what this tool alone provides.

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?

It explicitly states when to use the tool ('Use when you only need HOW MANY rows... not the rows themselves') and names the alternatives for retrieving matching rows. It also adds a cost rationale ('Cheaper than infino_keyword_search'), leaving no ambiguity about selection.

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

infino_create_databaseCreate the database this server is connected toA
Idempotent

Provision the database named in the connection. On Infino Cloud this registers the database; on a local path or bucket the catalog root is the database, so this is a no-op success. Idempotent: an existing database is reported as created: false. Call it when a hosted connection answers 404.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, but the description adds valuable behavioral nuance: existing databases are reported as created:false, and behavior differs by storage backend. This goes beyond the structured annotations. No contradiction with annotations is present.

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

Conciseness5/5

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

Three concise sentences with no filler. The first sentence states the core purpose, the second clarifies environment-specific behavior, and the third covers idempotency and when to call. Every sentence adds distinct value.

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

Completeness5/5

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

For a parameterless, low-complexity tool, the description is remarkably complete. It covers the operation, environment differences, idempotency behavior, and the explicit error context that should trigger the call. No output schema exists, but the description gives the key response field (created:false) for the relevant edge case.

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

Parameters4/5

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

The tool has zero parameters, so the baseline is 4. The description correctly explains that the database is derived from the connection rather than provided as an argument, which eliminates any expectation of a parameter. No parameter documentation is needed.

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 action with a specific verb and resource: 'Provision the database named in the connection.' It also clarifies the meaning in different environments (Cloud vs. local/bucket), which removes ambiguity. There is no sibling tool that creates a database, so this stands alone distinctly.

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 gives an explicit trigger condition: 'Call it when a hosted connection answers 404.' It also explains when the operation is a no-op on local paths or buckets. It does not name alternative tools for the same job, but no direct sibling alternative exists.

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

infino_create_tableCreate an Infino tableA

Create a table from a {column: type} descriptor. Full-text (BM25) indexes go on the columns named in 'fts' (default: every large_utf8 column; the index requires that type). With vector: true the server adds an 'embedding' column sized to its embedder and a cosine vector index on it, so semantic and hybrid search work and rows added without a vector are embedded from their text. Every column is required in every row you add, so declare only columns you will always fill. Give every table a stable key column of type utf8 so rows can be replaced or removed later by predicate (e.g. key = 'doc-1'); keep utf8 for ids and short labels and large_utf8 for the text to search, so the searches infer the right column.

ParametersJSON Schema
NameRequiredDescriptionDefault
ftsNoColumns to full-text index. Default: every large_utf8 column. Must be large_utf8.
tableYesTable name.
vectorNoAdd an 'embedding' vector column sized to the server's embedder, with a cosine index. Default false.
columnsYesColumns as {name: type}. large_utf8 for text to search; utf8 for a key, ids, and short labels.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark this as a write operation (readOnlyHint=false). The description adds valuable behavioral detail: fts indexes are created on large_utf8 columns by default, vector:true adds an embedding column and cosine index, rows without a vector are embedded from text, and every declared column is required in all rows. It does not state behavior if the table already exists, but there is no contradiction with annotations.

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?

Four dense sentences, each earning its place: the first states the core action, the second explains fts, the third explains vector behavior, and the fourth gives schema design guidance. It is front-loaded and contains no filler.

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

Completeness5/5

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

For a table-creation tool with no output schema, the description covers defaults, side effects, required-column policy, and search implications. It even explains how column type choices affect later searches. The only omitted detail is behavior on duplicate table names, but the idempotentHint=false annotation already signals that, so the description is complete for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: fts defaults and type requirements, vector column creation behavior, column type guidance (utf8 vs large_utf8), and the purpose of a stable key column. This enriches the agent's understanding of how to set each parameter.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Create a table from a {column: type} descriptor.' It clearly distinguishes this tool from siblings like infino_create_database, infino_describe_table, and infino_drop_table, and it conveys the core schema-definition responsibility without ambiguity.

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 gives clear context for when to use this tool and how to shape input: it explains fts defaults, vector behavior, required columns, and the recommendation to add a stable utf8 key column. It does not explicitly name alternatives or state when not to use it, but the guidance is strong enough for an agent to select it correctly.

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

infino_delete_documentsDelete documents from an Infino tableA
Destructive

Delete the rows matching a SQL predicate, e.g. "status = 'spam'". Returns how many rows matched and were removed. Check the predicate first with infino_count or infino_sql. Requires durable storage (not memory://).

ParametersJSON Schema
NameRequiredDescriptionDefault
tableYesTable to delete from.
predicateYesSQL predicate selecting the rows to delete, e.g. "status = 'spam'".

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark the tool as destructive and non-read-only. The description adds valuable behavior: it returns the number of rows matched and removed, and it requires durable storage rather than memory://. This goes beyond the structured annotations without contradicting them.

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

Conciseness5/5

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

Three sentences, each earning its place: the action and example, the return value, and the safety prerequisite. The most important information is front-loaded, and there is no filler or redundancy.

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

Completeness5/5

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

For a simple two-parameter destructive tool with no output schema, the description covers the essential context: what it deletes, what it returns, and the storage precondition. The safety hint to verify with count/sql rounds out the picture, making it complete for an agent to call correctly.

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

Parameters3/5

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

Schema description coverage is 100%, with both 'table' and 'predicate' already described. The tool description repeats the predicate example but adds no new parameter-level meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

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 a specific action ('Delete the rows matching a SQL predicate') and identifies the resource (rows in an Infino table). It also distinguishes itself from siblings like infino_drop_table by targeting rows rather than the whole table, and from query tools by emphasizing deletion.

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 gives explicit pre-use guidance: 'Check the predicate first with infino_count or infino_sql.' This tells the agent when to use related tools before invoking deletion. It does not explicitly contrast with infino_drop_table or infino_update_documents, but the context is clear enough.

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

infino_describe_tableDescribe an Infino tableA
Read-onlyIdempotent

Return a table's column names and types — call before searching so you know which column to target and what fields each result row carries.

ParametersJSON Schema
NameRequiredDescriptionDefault
tableYesTable name (from infino_list_tables).

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the practical context of using it before searching, but does not disclose output format, error behavior, or other behavioral details beyond what annotations provide.

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

Conciseness5/5

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

The description is a single sentence that front-loads the core function ('Return a table's column names and types') and then adds a concise, high-value usage note. Every word earns its place with no redundancy.

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

Completeness4/5

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

For a simple one-parameter read-only tool, the description covers what it returns and when to call it. There is no output schema, but the description adequately explains the return value; it could be more complete by mentioning what happens for a non-existent table, but that is 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 100% and the only parameter, 'table', is already described as 'Table name (from infino_list_tables).' The tool description adds no additional parameter-level meaning, so it stays at the baseline for full schema coverage.

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

Purpose5/5

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

The description uses a specific verb ('Return') and resource ('a table's column names and types'), making the tool's function immediately clear. It also distinguishes itself from search and table-management siblings by framing its role as a pre-search introspection step.

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 tells the agent when to call this tool ('call before searching') and why, which is strong usage guidance. It does not name alternative tools or state when not to use it, but the context is clear enough for correct selection among siblings.

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

infino_drop_tableDrop an Infino tableA
Destructive

Drop a table from the catalog and, by default, delete its storage objects too. Pass purge: false to only unregister the table and leave the bytes in place. Irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
purgeNoAlso delete the table's storage objects. Default true; false only unregisters the name.
tableYesTable to drop.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses the default deletion of storage objects, the purge: false escape hatch, and the irreversible nature of the operation. This is valuable behavioral context an agent needs before invoking a destructive tool.

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 three short sentences, front-loading the core action and default behavior, then explaining the optional parameter, then warning about irreversibility. No sentence is wasted.

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

Completeness5/5

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

For a simple two-parameter destructive tool with no output schema, the description covers the action, default behavior, the parameter that changes behavior, and the key risk. Nothing essential is missing for an agent to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters. The description restates the purge behavior but adds no new parameter-level meaning beyond what the schema provides.

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

Purpose5/5

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

The description states a specific verb and resource: 'Drop a table from the catalog.' It also clarifies the default storage-deletion behavior, which distinguishes it from simple catalog removal and from sibling tools like list or describe.

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 gives clear context for when to use the tool: to drop a table and optionally delete its storage. It does not explicitly name alternatives or exclusions, but the purge: false option provides a clear conditional behavior within the tool.

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

infino_exact_matchExact match (unranked exact filter)A
Read-onlyIdempotent

Use to fetch rows whose column exactly equals a value — a tag, status, or id string. Unranked exact-equality filter over an indexed column. For ranked text relevance use infino_keyword_search; for multi-column analytical filtering use infino_sql.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax rows to return; matches beyond this are counted in 'matched' but not returned.
tableYesTable to search.
valueYesThe exact value the column must equal.
columnNoColumn to match; inferred (first text column) if omitted.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds important behavioral context beyond that: the operation is 'unranked' and relies on an 'indexed column,' which sets expectations about ordering and prerequisites. It also clarifies that this is exact equality, not fuzzy or ranked matching.

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 three tight sentences with no filler. It front-loads the operation, adds a key behavioral qualifier, and then names alternatives in a compact final sentence. Every sentence earns its place.

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

Completeness5/5

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

For a read-only exact-filter tool, the description covers operation, value semantics, indexing expectations, and sibling differentiation. The schema fills in parameter details, including limit behavior and column inference, so nothing essential is missing for an agent to select and use this tool correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds extra meaning by giving expected value examples ('tag, status, or id string') and by framing column as an indexed column, which supplements the schema's generic definitions. Limit and table parameters are already well documented in 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 uses a specific verb and resource: 'fetch rows whose column exactly equals a value' and gives concrete value examples like tag, status, or id. It clearly distinguishes this tool from infino_keyword_search and infino_sql by calling it an 'unranked exact-equality filter.'

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 states the primary use case up front and explicitly routes the agent to infino_keyword_search for ranked text relevance and infino_sql for multi-column analytical filtering. This gives clear when-to-use and when-not-to-use guidance relative to the most relevant sibling tools.

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

infino_list_tablesList Infino tablesA
Read-onlyIdempotent

List the tables in the connected catalog. Call this first to discover what is available to search or query.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds the contextual detail of a connected catalog and discovery intent, which is useful but not a substantial behavioral disclosure beyond the annotations.

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 short sentences efficiently convey what the tool does and when to use it. The core action is front-loaded, and there is no redundant or filler content.

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

Completeness5/5

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

For a parameterless listing tool with strong safety annotations, the description fully covers the agent's needs: what it lists, where it lists from, and when to call it. No output schema is present, but the description implies the result is a set of available tables, which is sufficient for this simple operation.

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

Parameters4/5

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

The input schema has zero parameters, so there is no parameter burden for the description to carry. The baseline of 4 applies, and no additional parameter explanation is needed.

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 ('List the tables') and the resource scope ('connected catalog'). It also signals its role as a discovery entry point, distinguishing it from table-specific or query operations among the siblings.

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?

'Call this first to discover what is available to search or query' gives explicit when-to-use guidance, placing it before search/query operations. It does not explicitly name alternatives or exclusions, but the instruction is clear enough for initial orientation.

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

infino_sqlSQL over InfinoA
Destructive

Use for structural or analytical questions — counts, GROUP BY, joins, aggregates, filtering by column value — returning result rows. The engine's search functions are callable as table-valued relations, so a single query can rank AND aggregate: bm25_search('table','text_col','terms', k) — also bm25_search_prefix / token_match / exact_match — need no embedding. vector_search('table','vec_col', {{q}}, k) and hybrid_search('table','text_col','terms','vec_col', {{q}}, k) need a query vector: put a {{name}} placeholder where the vector goes and pass embed:{"name":"query text"} — the server embeds the text and substitutes the vector in. Example: SELECT path, SUM(end_line - start_line + 1) AS lines FROM bm25_search('docs','body','error timeout', 300) GROUP BY path ORDER BY lines DESC. Any single statement is allowed, DDL/DML included.

ParametersJSON Schema
NameRequiredDescriptionDefault
embedNoMap of placeholder name -> query text. Each text is embedded with the server's embedder and its vector is substituted for every {{name}} in the query — required to use vector_search / hybrid_search. E.g. {"q":"error timeout"} fills {{q}}.
queryYesA single SQL statement. May use search TVFs and {{name}} vector placeholders.

TDQS

A4.3/5.0
Behavior4/5

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

The annotation already marks the operation as destructive, and the description reinforces this by stating 'Any single statement is allowed, DDL/DML included.' It also discloses the server-side embedding behavior and placeholder substitution. It stops short of warning about potential destructive consequences or side effects, but the annotation covers the core safety signal.

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 long, but almost every sentence carries necessary information for correctly invoking this complex SQL tool. It is front-loaded with the purpose, then explains TVFs, embedding, gives an example, and closes with the important DDL/DML caveat. It could be tightened slightly, but it is structured and not padded.

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 tool with no output schema, the description adequately explains return value as 'result rows,' but the exact response shape for DDL/DML statements is left implicit. The coverage of query construction, embedding syntax, and search functions is strong and sufficient for an agent to call the tool correctly. Minor gaps remain around output format and error behavior.

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

Parameters4/5

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

Schema coverage is 100% and both parameters are documented in the schema, so the baseline is 3. The description adds value by explaining the {{name}} placeholder mechanism, the embed:{"name":"query text"} pattern, and concrete search function signatures such as bm25_search and hybrid_search. The example further clarifies how to combine query and embed.

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 explicitly states the tool is for structural or analytical questions and enumerates concrete operations: counts, GROUP BY, joins, aggregates, and column filtering. It also distinguishes this SQL gateway from the specialized sibling search/count tools by explaining that search functions are callable as table-valued relations within SQL.

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 first sentence clearly scopes appropriate use cases, and the TVF explanation shows when this tool is uniquely useful: a single query can both rank and aggregate. It also gives concrete syntax for embedding vectors. However, it does not explicitly say when to prefer a sibling tool instead, such as infino_keyword_search for simple searches.

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

infino_token_matchToken match (unranked keyword filter)A
Read-onlyIdempotent

Use when you need the SET of rows containing a keyword, not a ranked order — a fast unranked keyword filter. Returns rows whose text column contains the token(s), matching indexed tokens and their stems. For ranked results use infino_keyword_search; for analytical filtering across columns use infino_sql.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoMatch any token ('or', the default) or every token ('and').
limitNoMax rows to return; matches beyond this are counted in 'matched' but not returned.
queryYesToken(s) to match.
tableYesTable to search.
columnNoText column to match; inferred if omitted.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the description's job is lighter. It adds meaningful behavioral context beyond annotations: the operation is fast, unranked, matches indexed tokens and their stems, and returns a set of rows. This gives the agent a clear model of what the tool does without contradicting the annotations.

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

Conciseness5/5

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

Three sentences, each earning its place: the first states the use case and core behavior, the second defines the return semantics, and the third routes to alternatives. The most decision-relevant information is front-loaded.

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

Completeness5/5

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

For a read-only filtering tool with a fully documented schema and explicit sibling routing, the description is complete. It covers purpose, behavior, return semantics, and alternatives; the schema covers parameter details. No output schema exists, but the description's statement that it returns rows containing the tokens is sufficient for this tool's complexity.

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 100%, so the input schema already documents all five parameters, including defaults, enums, and inference behavior. The description adds no parameter-level detail beyond what the schema provides, so the baseline score of 3 is appropriate.

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 returns rows whose text column contains the token(s), and explicitly frames it as an unranked keyword filter producing a set rather than a ranked order. It distinguishes itself from infino_keyword_search and infino_sql, so an agent can identify the correct tool without opening schemas.

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 opens with a precise when-to-use condition: when you need the set of rows containing a keyword, not ranked results. It also names explicit alternatives and the conditions that select them: infino_keyword_search for ranked results and infino_sql for analytical filtering across columns.

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

infino_update_documentsUpdate documents in an Infino tableA
Destructive

Replace the rows matching a SQL predicate with new documents, 1:1; the number of matched rows must equal the number of replacement documents. As with add, a row that omits its vector has it embedded from the text column (local model, no API key). Requires durable storage (not memory://).

ParametersJSON Schema
NameRequiredDescriptionDefault
tableYesTable to update.
documentsYesReplacement rows, as JSON objects keyed by column name (one per matched row).
predicateYesSQL predicate selecting the rows to replace, e.g. "status = 'draft'".

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only state destructiveHint=true, which the description confirms and expands upon. It adds meaningful behavioral details: the operation is strictly 1:1, embeddings are generated locally when omitted, and memory:// storage is unsupported. This goes beyond the annotation hints and gives an agent important operational expectations.

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 compact and front-loaded, starting with the core operation and the key constraint. Each sentence delivers distinct operational information without redundancy or filler.

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 destructive tool with no output schema, the description covers the operation, cardinality constraint, embedding behavior, and storage requirement. It does not specify what happens on count mismatch, but the 'must equal' phrasing implies an error condition, so the definition is still largely complete.

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

Parameters4/5

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

The schema already describes each parameter, but the description adds the crucial relationship between predicate and documents—that the number of matched rows must equal the number of replacement documents. It also explains how vector omission in documents is handled, which is not apparent from the schema alone.

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

Purpose5/5

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

The description uses the specific verb 'replace' and identifies the resource as 'rows matching a SQL predicate', with a clear 1:1 mapping to new documents. This distinguishes it from sibling operations like add or delete, even without naming them.

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 provides clear context for when to use the tool: replacing existing rows selected by a predicate, with a count equality requirement. It also gives a necessary precondition ('Requires durable storage'). However, it does not explicitly contrast this with alternatives like delete-then-add or SQL updates.

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. 10 tool updatesv0.14.0
    • Addedinfino_add_documents
    • Addedinfino_create_database
    • Addedinfino_create_table
    • Addedinfino_delete_documents
    • Addedinfino_drop_table
    • Changedinfino_hybrid_search2 fields changed
      • changedInput schema / properties / columns / description
        Previous value: -"Columns to return with each hit (e.g. an id, path, or line range to cite). Defaults to the text column; '_id' and 'score' are always included."New value: +"Which of the table's columns each hit returns, with full values (a projection passed straight to the engine). Defaults to the text column; '_id' and 'score' are always included. Any column works: ['id'] for compact hits at a large k, ['id', 'text'] to get the full text alongside an id to cite, ['title', 'created_at'] for metadata. Nothing is truncated; read fewer columns or a smaller k to keep results small."
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "Keyword half: match any query token ('or', the default) or require every token ('and').",
        +  "enum": [
        +    "or",
        +    "and"
        +  ],
        +  "type": "string"
        +}
    • Changedinfino_keyword_search3 fields changed
      • changedInput schema / properties / columns / description
        Previous value: -"Columns to return with each hit (e.g. an id, path, or line range to cite). Defaults to the searched column; '_id' and 'score' are always included."New value: +"Which of the table's columns each hit returns, with full values (a projection passed straight to the engine). Defaults to the searched column; '_id' and 'score' are always included. Any column works: ['id'] for compact hits at a large k, ['id', 'text'] to get the full text alongside an id to cite, ['title', 'created_at'] for metadata. Nothing is truncated; read fewer columns or a smaller k to keep results small."
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "Match any query token ('or', the default) or require every token ('and').",
        +  "enum": [
        +    "or",
        +    "and"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / stats
        Added value: +{
        +  "description": "BM25 statistics scope: 'per_superfile' (the default; each segment scored against its own statistics) or 'global' (one table-wide idf, so a table written in many small batches ranks like one corpus).",
        +  "enum": [
        +    "per_superfile",
        +    "global"
        +  ],
        +  "type": "string"
        +}
    • Changedinfino_semantic_search1 field changed
      • changedInput schema / properties / columns / description
        Previous value: -"Columns to return with each hit (e.g. an id, path, or line range to cite). Defaults to the text column; '_id' and 'score' are always included."New value: +"Which of the table's columns each hit returns, with full values (a projection passed straight to the engine). Defaults to the text column; '_id' and 'score' are always included. Any column works: ['id'] for compact hits at a large k, ['id', 'text'] to get the full text alongside an id to cite, ['title', 'created_at'] for metadata. Nothing is truncated; read fewer columns or a smaller k to keep results small."
    • Changedinfino_sql1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"A single read-only SELECT or WITH statement. May use search TVFs and {{name}} vector placeholders."New value: +"A single SQL statement. May use search TVFs and {{name}} vector placeholders."
    • Addedinfino_update_documents
  2. 8 tool updatesv0.10.0
    • Changedinfino_count1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedinfino_describe_table1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedinfino_exact_match1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedinfino_hybrid_search1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedinfino_keyword_search1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedinfino_semantic_search2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / filter / additionalProperties
        Removed value: -false
    • Changedinfino_sql2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / embed / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedinfino_token_match1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
  3. 9 tool updatesv0.7.0
    • First observedinfino_count
    • First observedinfino_describe_table
    • First observedinfino_exact_match
    • First observedinfino_hybrid_search
    • First observedinfino_keyword_search
    • First observedinfino_list_tables
    • First observedinfino_semantic_search
    • First observedinfino_sql
    • First observedinfino_token_match

TDQS

A4.6/5.0

Scored across 9 tools

Disambiguation5/5

Each search tool serves a distinctly different mode (unranked token match, ranked BM25, semantic vector, hybrid, exact equality, count), and the descriptions explicitly cross-reference when to use each. Metadata tools (list/describe tables) and SQL are clearly separate.

Naming Consistency5/5

All tools follow a consistent infino_ prefix with snake_case, and the second component is either a verb (list, describe, count, search) or a clear action noun (token_match, exact_match). No mixed styles.

Tool Count5/5

9 tools is well-scoped for a search/query server, covering metadata discovery, multiple search paradigms, and a flexible SQL query interface without unnecessary bloat.

Completeness5/5

The tool surface comprehensively covers the read-only search/query domain: table discovery, schema inspection, keyword/semantic/hybrid/exact search, counting, and arbitrary SQL aggregation. No critical missing operations for its intended purpose.

Maintenance

ActivityActive
ResponsivenessNo issues

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
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to perform semantic, hybrid, and filtered search on indexed local documentation with RAG capabilities.
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to maintain persistent, local memory with retrieval-augmented search, knowledge graphs, and context surfacing, without any cloud dependencies.
    135
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to index and search local files, websites, GitHub repos, and packages with hybrid AI-powered retrieval, all locally through IDE chat.
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides a local vector memory store for AI agents with semantic search, offline embeddings, and MCP integration, enabling tools like Claude and Cursor to store and retrieve information without cloud dependencies.
    8
    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/infino-ai/infino-mcp'

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