Infino MCP server
OfficialAn MCP server that lets an AI agent discover, search, and analyze Infino data (local paths, object storage, or Infino Cloud) using semantic, keyword, hybrid, and SQL retrieval — read-only by default, with optional write support.
Explore the catalog: list tables and inspect column names/types.
Semantic search by meaning, using local embeddings (no API key, nothing leaves the machine).
Keyword/BM25 search for literal terms, identifiers, error codes, and exact phrases.
Hybrid search that fuses keyword and semantic ranking in one pass.
Unranked token matching and exact-value filtering over indexed columns.
Count how many rows match a keyword query without fetching them.
Run SQL analytics (SELECT/WITH on read-only mode) for counts, filters, joins, and aggregates.
When writes are enabled: add, update, and delete documents; allow DDL/DML in SQL.
Connect to a local directory, S3/S3-compatible/Azure blob storage, or a hosted Infino Cloud endpoint with an API key.
Allows using Backblaze B2 as an S3-compatible storage backend for Infino data.
Allows using Cloudflare R2 as an S3-compatible storage backend for Infino data.
Provides local embedding using Hugging Face models for semantic search, with nothing leaving the machine.
Allows using MinIO as an S3-compatible storage backend for Infino data.
Allows using OpenAI-compatible embedding APIs (including Azure OpenAI) for semantic retrieval.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Infino MCP serversearch my meeting notes for action items from last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Infino MCP server
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-aiOn 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-serverAdd more knobs with repeated -e flags, e.g. -e INFINO_MCP_VALIDATE=true. Verify with:
claude mcp list
claude mcp get infinoClaude Desktop
Edit the configuration file (create it if it doesn't exist), then fully restart Claude Desktop.
OS | Path |
macOS |
|
Windows |
|
Linux |
|
{
"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 |
| No |
| Data to serve: a local path ( |
| With a hosted URI | — | API key ( |
| No |
| Embedding provider: |
| With | — | Base URL of the OpenAI-compatible embeddings API, e.g. |
| No | — | API key for the |
| No |
| The embedding model. For |
| No | off | When set ( |
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 |
|
S3-compatible (R2/MinIO/B2) |
|
Azure Blob |
|
Infino Cloud (hosted) |
|
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 |
|
| Find passages by meaning — embeds the query with a local model (no key) and ranks by vector similarity. Handles paraphrase and synonyms. |
|
| BM25 full-text search — for exact terms, identifiers, error codes, product names. |
|
| 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. |
|
| Unranked keyword filter — the set of rows whose text column contains the token(s). Use when you need the matches, not a relevance order. |
|
| Unranked exact-equality filter over an indexed column (tag, status, id string). |
|
| Count how many rows match a keyword query, without fetching them — a fast tally over the text column. For the matching rows use |
|
| SQL for counts, filters, joins, aggregates. The engine's search table functions are callable inside it; a |
| — | List the tables in the connected catalog. |
|
| Column names and types for a table. |
| — | Provision the database the connection names (Infino Cloud); a no-op success locally. Idempotent. |
|
| Create a table from a |
|
| Drop a table and, by default, delete its storage objects; |
|
| Append rows (one call = one commit). Rows without a vector are embedded from the text column, all in one batch; the result reports |
|
| Replace the rows matching a SQL predicate with new documents, 1:1 (missing vectors are embedded). Durable storage only. |
|
| 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:
infino_create_databaseif a hosted database answers 404.infino_create_tablewith autf8key column,large_utf8text columns, andvector: truefor semantic search. The server sizes the vector column to its embedder; the agent never types a dimension. Keep the result: itsindexesfield is the only record of which columns are indexed.infino_add_documents, tens of rows per call, always including the key. Missing vectors are embedded in one batch.To replace rows,
infino_delete_documentsby key predicate, then add again. To remove rows, check the predicate withinfino_countfirst.
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_URIis a hostedhttps://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_URIat 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 |
| The env var isn't reaching the subprocess. In GUI clients, env must be inside the server's |
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 |
|
Dimension / vector errors on semantic search | The table's vector index doesn't match the embedding model's dimension. Re-ingest, or set |
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 stdioPoint 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.jsLicense
Available Tools
15 toolsinfino_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.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table to append to. | |
| documents | Yes | Rows to append, as JSON objects keyed by column name. |
TDQS
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.
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.
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.
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.
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.
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 matchesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Match any token ('or', the default) or every token ('and'). | |
| query | Yes | Query terms, matched as literal tokens. | |
| table | Yes | Table to search. | |
| column | No | Text column to search; inferred from the table schema when omitted. |
TDQS
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.
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.
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.
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.
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.
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 toAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fts | No | Columns to full-text index. Default: every large_utf8 column. Must be large_utf8. | |
| table | Yes | Table name. | |
| vector | No | Add an 'embedding' vector column sized to the server's embedder, with a cosine index. Default false. | |
| columns | Yes | Columns as {name: type}. large_utf8 for text to search; utf8 for a key, ids, and short labels. |
TDQS
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.
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.
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.
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.
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.
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 tableADestructive
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://).
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table to delete from. | |
| predicate | Yes | SQL predicate selecting the rows to delete, e.g. "status = 'spam'". |
TDQS
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.
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.
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.
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.
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.
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 tableARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name (from infino_list_tables). |
TDQS
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.
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.
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.
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.
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.
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 tableADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| purge | No | Also delete the table's storage objects. Default true; false only unregisters the name. | |
| table | Yes | Table to drop. |
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows to return; matches beyond this are counted in 'matched' but not returned. | |
| table | Yes | Table to search. | |
| value | Yes | The exact value the column must equal. | |
| column | No | Column to match; inferred (first text column) if omitted. |
TDQS
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.
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.
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.
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.
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.
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_hybrid_searchHybrid (keyword + semantic) searchARead-onlyIdempotent
Use when a query carries both specific terms and an intent — you want exact-term precision without giving up paraphrase recall. Fuses BM25 over a text column with vector similarity over the embedding column in a single ranking pass, so rows matching the literal terms AND the meaning rank highest; the score is the fused rank (higher is better) plus the columns you project ('columns'; the full text column by default). Embeds the query with a local model (no API key). Sits between infino_keyword_search (literal only) and infino_semantic_search (meaning only).
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Maximum results. | |
| mode | No | Keyword half: match any query token ('or', the default) or require every token ('and'). | |
| query | Yes | Query text; matched as keyword terms AND embedded for vector similarity. | |
| table | Yes | Table to search. | |
| column | No | Text column for the keyword half; inferred if omitted. | |
| columns | No | 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. | |
| vectorColumn | No | Vector column for the semantic half; inferred if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses that the query is embedded locally with no API key, that scoring is a fused rank where higher is better, and that projection is passed straight to the engine with no truncation. These are behavioral details an agent cannot infer from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a tight four-sentence paragraph that front-loads the usage trigger, then explains mechanism, scoring, and sibling placement. Every sentence contributes distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description covers what the result contains (fused rank score plus projected columns, with _id and score always included per the schema). Combined with the rich parameter schema and safety annotations, an agent has everything needed to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by explaining the fused-rank score semantics and the default projection to the full text column. Most parameter-level detail already lives in the schema, so this is a solid enhancement rather than a complete re-documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete use case and names the exact mechanism: fusing BM25 keyword matching with vector similarity in one ranking pass. It also positions itself between infino_keyword_search and infino_semantic_search, so an agent can distinguish it from sibling tools immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use when' a query has both specific terms and intent, and names the two alternatives with their limitations ('literal only' vs 'meaning only'). This gives clear selection criteria without needing to inspect sibling schemas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
infino_keyword_searchKeyword (BM25) searchARead-onlyIdempotent
Use when the query is literal terms — identifiers, error codes, product names, exact phrases — and you want results ranked by relevance. BM25 full-text search over a text column: ranks rows by how well the query's tokens (and their stems) match, each with a relevance score (higher is better) plus the columns you project ('columns'; the full text column by default). Matches exact tokens, not synonyms or paraphrases. Prefer this over SQL LIKE for known literal terms. For meaning-based search use infino_semantic_search; for both at once use infino_hybrid_search.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Maximum results to return. | |
| mode | No | Match any query token ('or', the default) or require every token ('and'). | |
| query | Yes | Query terms, matched as literal tokens. | |
| stats | No | 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). | |
| table | Yes | Table to search. | |
| column | No | Text column to search; inferred from the table schema when omitted. | |
| columns | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only, idempotent, and non-destructive, so the description adds valuable behavioral context beyond that: it matches exact tokens and stems, returns relevance scores where higher is better, and never truncates projected values. This helps the agent predict output size and semantics without overstepping the annotation safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the key use condition, then explains the ranking behavior, then routes to alternatives, and then details parameter nuances. Every sentence adds value, and the structure makes it easy for an agent to quickly decide whether to use this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema, the description covers the essential return shape by stating that results include a relevance score and projected columns, with '_id' and 'score' always included. It also addresses result-size concerns through the 'k' parameter and the 'columns' projection guidance, making the tool fully usable without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful guidance beyond the schema, especially for 'columns' with concrete examples like ['id'] for compact hits and ['id', 'text'] for citing, plus the caveat that nothing is truncated. It also clarifies the practical effect of the 'stats' scope, which the schema describes but does not motivate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'BM25 full-text search over a text column' that ranks rows by token/stem relevance. It also distinguishes itself from siblings by noting it matches exact tokens, not synonyms or paraphrases, and explicitly contrasts with infino_semantic_search and infino_hybrid_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It opens with an explicit when-to-use condition: 'Use when the query is literal terms — identifiers, error codes, product names, exact phrases.' It also gives direct routing guidance: 'Prefer this over SQL LIKE for known literal terms' and names the exact alternatives for meaning-based and combined search.
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 tablesARead-onlyIdempotent
List the tables in the connected catalog. Call this first to discover what is available to search or query.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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_semantic_searchSemantic (vector) searchARead-onlyIdempotent
Use when searching for a concept by meaning and the exact wording is unknown — this retrieves paraphrases and synonyms, not just literal matches. Embeds the query with a local model (no API key) and ranks a table's embedding column by vector similarity. Each hit carries a score that is a DISTANCE (lower is closer) plus the columns you project ('columns'; the full text column by default). Optional 'filter' restricts the ranking to rows whose keyword column matches a predicate first (a pushdown pre-filter, e.g. semantic search only within rows tagged 'billing'). For exact terms use infino_keyword_search; when the query has both literal terms and an intent use infino_hybrid_search.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | Maximum results. | |
| query | Yes | Query text; embedded and matched by vector similarity. | |
| table | Yes | Table to search. | |
| column | No | Text column to return with each hit; inferred if omitted. | |
| filter | No | Pre-filter: rank the kNN only among rows whose FTS 'column' matches 'query' (a pushdown pre-filter, not a post-filter on the results). | |
| columns | No | 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. | |
| vectorColumn | No | Vector column to search; inferred if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already mark this as read-only, idempotent, and non-destructive, the description adds valuable behavioral details: it uses a local model with no API key, returns a distance score where lower is closer, and applies filters as a pushdown pre-filter rather than a post-filter. These details materially affect how an agent interprets results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It front-loads the primary use case, then covers score semantics, filters, projections, and alternatives without repetition or filler. The structure is logical and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains what each hit contains, how scores behave, what defaults are used, and how nested filters work. The required parameters and common optional parameters are all contextualized. An agent has enough information to call this tool correctly and interpret its results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage, but the description goes further by explaining practical parameter behavior: how 'columns' can be used for compact vs. full projection, that '_id' and 'score' are always included, that 'filter' is a pushdown pre-filter, and that the default text column is used. This is exactly the kind of parameter guidance that helps an agent invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific use case ('searching for a concept by meaning'), identifies the resource ('a table's embedding column'), and immediately contrasts itself with sibling tools. The distinction from exact-match and hybrid search is explicit, so an agent can select it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description opens with 'Use when...' and later names the two relevant alternatives with their conditions: 'For exact terms use infino_keyword_search; when the query has both literal terms and an intent use infino_hybrid_search.' This explicitly tells an agent when to choose this tool and when to choose a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
infino_sqlSQL over InfinoADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| embed | No | Map 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}}. | |
| query | Yes | A single SQL statement. May use search TVFs and {{name}} vector placeholders. |
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Match any token ('or', the default) or every token ('and'). | |
| limit | No | Max rows to return; matches beyond this are counted in 'matched' but not returned. | |
| query | Yes | Token(s) to match. | |
| table | Yes | Table to search. | |
| column | No | Text column to match; inferred if omitted. |
TDQS
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.
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.
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.
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.
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.
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 tableADestructive
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://).
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table to update. | |
| documents | Yes | Replacement rows, as JSON objects keyed by column name (one per matched row). | |
| predicate | Yes | SQL predicate selecting the rows to replace, e.g. "status = 'draft'". |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.14.0- Added
infino_add_documents - Added
infino_create_database - Added
infino_create_table - Added
infino_delete_documents - Added
infino_drop_table - Changed
infino_hybrid_search2 fields changed- changed
Input schema / properties / columns / descriptionPrevious 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." - added
Input schema / properties / modeAdded value: +{ + "description": "Keyword half: match any query token ('or', the default) or require every token ('and').", + "enum": [ + "or", + "and" + ], + "type": "string" +}
- Changed
infino_keyword_search3 fields changed- changed
Input schema / properties / columns / descriptionPrevious 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." - added
Input schema / properties / modeAdded value: +{ + "description": "Match any query token ('or', the default) or require every token ('and').", + "enum": [ + "or", + "and" + ], + "type": "string" +} - added
Input schema / properties / statsAdded 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" +}
- Changed
infino_semantic_search1 field changed- changed
Input schema / properties / columns / descriptionPrevious 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."
- Changed
infino_sql1 field changed- changed
Input schema / properties / query / descriptionPrevious 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."
- Added
infino_update_documents
8 tool updates
v0.10.0- Changed
infino_count1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
infino_describe_table1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
infino_exact_match1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
infino_hybrid_search1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
infino_keyword_search1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
infino_semantic_search2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / filter / additionalPropertiesRemoved value: -false
- Changed
infino_sql2 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / embed / propertyNamesAdded value: +{ + "type": "string" +}
- Changed
infino_token_match1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
9 tool updates
v0.7.0- First observed
infino_count - First observed
infino_describe_table - First observed
infino_exact_match - First observed
infino_hybrid_search - First observed
infino_keyword_search - First observed
infino_list_tables - First observed
infino_semantic_search - First observed
infino_sql - First observed
infino_token_match
TDQS
Scored across 9 tools
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.
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.
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.
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
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
Ingest, manage, and retrieve documents for RAG-powered AI applications
Universal persistent memory and knowledge retrieval layer for AI agents and LLMs.
Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.
Disposable private vector search + semantic RAG for AI agents. x402 pay-per-call, no account.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to perform semantic, hybrid, and filtered search on indexed local documentation with RAG capabilities.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to maintain persistent, local memory with retrieval-augmented search, knowledge graphs, and context surfacing, without any cloud dependencies.135MIT
- AlicenseNot gradedqualityBmaintenanceEnables 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
- AlicenseNot gradedqualityBmaintenanceProvides 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.8MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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