Skip to main content
Glama

Crates.io Docs.rs Book Benchmark Linux Windows macOS Supply chain Security License

What is mq-bridge?

mq-bridge is an asynchronous Rust library that moves messages and data between systems: Kafka, NATS, RabbitMQ, MQTT, MongoDB, PostgreSQL/MySQL/SQLite, Postgres CDC, ClickHouse, Redis Streams, HTTP, WebSocket, gRPC, ZeroMQ, AWS SQS/SNS, IBM MQ, cloud object storage, files, and in-memory channels. Every endpoint sits behind the same batch-shaped receive_batch / send_batch traits, so any source can feed any sink.

A route connects one input to one output. In between, it can transform, filter, fan out, retry, rate-limit, deduplicate, or answer a request, all by configuration. Where configuration isn't enough, you add a handler in Rust, Python or Node.js. Batching, ack/nack, commit ordering and broker I/O stay in the Tokio-based core, so your code works with plain CanonicalMessages and doesn't handle Kafka offsets or AMQP nacks.

It is a library you embed in your own service, not a daemon or platform you operate. If you'd rather not write code, mq-bridge-app runs the same engine and config as a CLI, server, desktop app, and MCP server.

Related MCP server: SEOSiri Data Pipeline MCP

Use cases

Problem

Guide with a runnable example

A RAG or semantic-search index drifts from its Postgres source

Keep a vector index in sync with Postgres: CDC → embeddings → Qdrant

Search results show what MongoDB no longer has

Keep a search index in sync with MongoDB: change stream → Meilisearch

Free-text messages need routing by what they say

Classify and route messages with an LLM

Events need a database record and per-key history to act on

Enrich events and keep per-key history in Postgres

A service must update its database and publish an event atomically

Transactional outbox with Postgres and Kafka

Tests for Kafka, NATS or RabbitMQ consumers need a running broker

Test message handlers without a broker

Quick Start

Install the library for your language:

Language

Package

Install

Rust

mq-bridge

cargo add mq-bridge --features kafka,nats,yaml

Python

mq-bridge (PyPI)

pip install mq-bridge

Node.js

mq-bridge (npm)

npm install mq-bridge

C / C++

mq_bridge.h

cargo build --release -p mq-bridge-c (build from source)

Describe a route — here Kafka → NATS with retries — in routes.yaml:

kafka_to_nats:
  input:
    kafka: { url: "localhost:9092", topic: "orders", group_id: "bridge" }
  output:
    middlewares:
      - retry: { max_attempts: 5 }
    nats: { url: "nats://localhost:4222", subject: "orders.processed" }

Run it:

from mq_bridge import Route
Route.from_file("routes.yaml", "kafka_to_nats").run()  # blocks; use start() to keep going
import { Route } from "mq-bridge";
Route.fromFile("routes.yaml", "kafka_to_nats").start();
mq_bridge::deploy_file("routes.yaml").await?; // every route in the file, in the background

Attach a handler (with_handler / withHandler) when you need business logic in between. No code at all? mq-bridge-app runs the same engine from the command line or a desktop UI:

mqb copy 'kafka://localhost:9092?topic=orders' 'nats://localhost:4222?subject=orders.processed'

Capabilities at a glance

Every row works from the Rust crate, the Python and Node.js packages, and the zero-code app; the Cargo feature is only needed when you build the Rust crate yourself. The linked book documents the library as well as the app.

Capability

How (endpoint / middleware · Cargo feature)

Docs

Message brokers: Kafka, NATS (JetStream), RabbitMQ (AMQP), MQTT, Redis Streams, AWS SQS/SNS, IBM MQ, ZeroMQ

kafka, nats, amqp, mqtt, redis_streams, aws, ibmmq, zeromq endpoints · features kafka, nats, amqp, mqtt, redis-streams, aws, ibm-mq, zeromq

Connectors

Change Data Capture (CDC): stream Postgres or MongoDB changes to Kafka, files, a warehouse, …

postgres_cdc (logical replication, pgoutput) · postgres-cdc; mongodb with consume: capture_all / capture_new (change streams) · mongodb

Postgres CDC tutorial · MongoDB

SQL databases: PostgreSQL, MySQL, MariaDB, SQLite as source (cursor polling) or sink (insert / upsert)

sqlx endpoint · sqlx

PostgreSQL / MySQL / SQLite · Upserts

MongoDB as source or sink

mongodb endpoint · mongodb

MongoDB

ClickHouse bulk insert and resumable reads

clickhouse endpoint · clickhouse

ClickHouse

Search engines and other bulk document APIs (Meilisearch, Typesense, Elasticsearch, Qdrant, PostgREST / Supabase)

http_bulk endpoint · http-bulk

HTTP bulk

LLMs and embeddings over an OpenAI-compatible API (OpenAI, Ollama, vLLM, …): classify, summarise or embed each message

openai_chat, openai_embeddings endpoints · http-bulk

OpenAI-compatible APIs · LLM cookbook

Object storage: S3 (and S3-compatible, e.g. R2), GCS, Azure Blob, or a local directory, as Parquet, JSONL or CSV

object_store endpoint with format: parquet | raw | json | csv · object-store, parquet

Object storage

Files: CSV and JSONL, read and write

file endpoint · built in

File

Analytics / warehouses: Snowflake, BigQuery, Databricks / Spark, Athena / Trino, DuckDB via Parquet on S3/GCS/Azure. These are not native connectors: mq-bridge writes the Parquet files, the warehouse loads or queries them

object_store with format: parquet · parquet

Snowflake · BigQuery · Databricks / Spark · Athena / Trino · DuckDB

HTTP, gRPC, WebSocket as server or client, including request/reply

http, grpc, websocket endpoints · http, grpc, websocket

HTTP · gRPC · Request / reply

Schema validation and type coercion (JSON Schema subset, field mapping)

transform middleware · built in

Transform & schema mapping

Reliability: retries, dead-letter queue, deduplication, rate limiting

retry, dlq, deduplication, limiter middleware · dedup for deduplication

Middleware reference · Delivery guarantees

Broker-free tests: run a route or handler against in-memory channels, no Docker

memory endpoint · built in

Embed the library

ETL without code

mq-bridge-app: mqb copy <from> <to>, YAML routes, desktop UI, MCP server

Quick start: mqb copy

More systems through plugins: Apache Pulsar, Meilisearch, and Redpanda Connect's inputs, outputs and processors

native plugins · plugin

Plugin endpoints · Connect plugin: inputs, outputs, processors

The Connect plugin links only Redpanda Connect components free of Redpanda Community License code (bundled code is Apache-2.0 and MIT), so some upstream components, such as its Kafka, AWS and Snowflake ones, are not included; see what is not included.

For AI agents: llms.txt is a curated index of the documentation, and npx skills add marcomq/mq-bridge installs a skill that teaches Claude Code, Codex and other agents to drive mqb.

Benchmarks

Like-for-like ETL comparisons, measured through the zero-code mq-bridge-app; every number, baseline and command is in the ETL benchmark harness:

Scenario

mq-bridge

Compared with

CSV → JSONL, 1M mixed-type rows (~116 MiB)

3,134,796 rows/s, ~29 MiB RAM

Meltano (tap-csv → target-jsonl): 9,771 rows/s, ~444 MiB RAM — mq-bridge ~321x fasterDuckDB, all cores: 2,109,704 rows/s — mq-bridge ~1.5x faster, ~18x less memory

Kafka → file, 1M rows, no transform

878,105 rows/s, ~160 MiB RAM

Sea Streamer, mimalloc build: 492,465 rows/s, ~894 MiB RAM — mq-bridge ~1.8x faster (also ~1.8x vs. its default-allocator build)

The CSV row reuses an existing, independently published 1M-row CSV → JSONL workload, on a byte-identical fixture: 7 mixed-type columns, seed 42, 121,981,421 bytes, SHA-256 a84894e0…0c45b221 (full definition). Whole-process wall-clock, no transformation, Meltano run on the same machine and file.

All figures: mq-bridge 0.4.20. DuckDB is a throughput ceiling for the conversion itself, not an ETL tool.

External benchmark: both the Rust library (mq-bridge) and the Python binding (mq-bridge-py) are entries on the third-party http-arena.com leaderboard, which compares HTTP frameworks by requests per second (live, so rankings shift over time). It measures mq-bridge's HTTP (and WebSocket) serving path, which is one endpoint among many, not broker or ETL throughput; those are covered under Benchmarks. See the Python analysis notes for the local comparison harness.

Why mq-bridge

What you get from one engine, whichever language you call it from:

  • 20+ native transports, 100+ more via plugin, one API: every connector listed above, plus dir_spool (a crash-safe directory FIFO queue), behind the same receive_batch / send_batch shape.

  • Redpanda Connect reach: the Connect plugin adds Redpanda Connect's production-proven components — 56 inputs and 68 outputs as endpoints, plus 86 processors, most of which also run as middleware on any endpoint — while mq-bridge keeps routing, batching, retries, DLQ and deduplication.

  • Change Data Capture: stream row-level changes from Postgres (logical replication / pgoutput) and MongoDB (change streams) as flat rows with an operation marker.

  • Restart-safe delivery: batch-aware ack/nack with commit sequencing for cumulative-ack brokers; the integration suite shows no data loss during in-flight broker restarts, including a Postgres CDC restart-safety test.

  • Reliability middleware, not a framework: retries, dead-letter queues, deduplication, rate limiting, and cookie/session persistence wrap any endpoint.

  • Polyglot on one engine: the same Rust core ships as native Python and Node.js bindings; routing, batching, and broker I/O stay in Rust.

  • TLS everywhere, one config shape: a single TlsConfig block (CA bundle, client cert/key for mTLS, insecure-skip) is reused across transports.

  • Self-hosted, no daemon: generate config in the optional UI, paste it into your code, run it in-process. No hosted control plane, no separate scheduler.

Prefer not to write code? mq-bridge-app runs the exact same engine as a standalone, zero-code ETL service configured entirely by YAML or environment variables. It ships a Postman-style UI to build, send, and inspect messages against a route, and can import Postman collections and AsyncAPI documents to scaffold routes and endpoints. Everything about the app — install, CLI, UI, cookbook, tuning — is in the 📖 book.

When to use mq-bridge

  • Hybrid Messaging: Connect systems speaking different protocols (e.g., MQTT to Kafka) without writing a custom adapter for every pair.

  • Batch-heavy Pipelines: Increase throughput by moving messages in batches while keeping per-message ack/nack decisions.

  • Infrastructure Abstraction: Write business logic against CanonicalMessages and swap the underlying transport later.

  • Resilient Pipelines: Apply retry, DLQ, deduplication, limiter, and cookie/session behavior consistently around endpoints.

  • Database Integration: Combine databases with message brokers, for example by ingesting messages into SQL/MongoDB or forwarding outbox rows to a broker.

  • Sidecar / Gateway: Run the bridge beside another service to ingest, filter, and route messages before they reach the core application.

When NOT to use mq-bridge

  • Stateful Stream Processing: For windowing, joins, or complex aggregations over time, dedicated stream processing engines are more suitable.

  • Domain Aggregate Management: If you need a framework to manage the lifecycle, versioning, and replay of domain aggregates (Event Sourcing), use a specialized library. mq-bridge handles the bus, not the entity.

  • Protocol-Specific Power Features: mq-bridge intentionally exposes a common subset: publish/consume, pub/sub where possible, request-reply where possible, batching, middleware, and ack/nack handling. If your application depends on highly specific broker features, using that broker's native client directly may be better.

Documentation

The 📖 mq-bridge book covers the library and the app. Connectors, middleware and tuning use the same settings in both.

I want to…

Read

Embed the library, write handlers, publish from code

Quick start: library · Embed the library · Bindings API · docs.rs

Move data without code

Quick start: mqb copy · Desktop UI · CLI · MCP server

Configure a connector

Connectors, with YAML and URL examples for each

Know what each backend supports (subscriber mode, request-reply, nack, CDC vs. polling)

Overview & capabilities · Capability tables (acknowledgement, commit order, replies, TLS)

Add retries, DLQ, dedup, transform, routing

Cookbook · Middleware & structural endpoints

Understand delivery guarantees and idempotent sinks

Delivery guarantees

Build request/reply or CQRS-style flows

Request / reply · Embed the library: CQRS

Tune throughput

Performance tuning

Write my own endpoint, middleware or plugin

EXTENDING.md · PLUGINS.md

Understand the internals

ARCHITECTURE.md · CONFIGURATION.md

Status

mq-bridge was created in 2025. Its reliability behavior is exercised by an automated integration and performance suite across supported endpoints, in each of the queue and subscriber modes that endpoint supports:

  • All endpoints showed no data loss during in-flight broker restarts; MQTT publish confirmation was hardened until a chaos test drove in-flight loss to zero.

  • Postgres CDC has a restart-safety test: an un-acked, in-flight batch is redelivered after a database restart with no loss and no gap.

It is used as rust library in armature and as python lib in omniload.

Stability and Rust version

Since 1.0 the Rust API follows semantic versioning: the crate root and the modules models, traits, errors, outcomes, extensions, plugin (the SDK), type_handler, publisher, route and checkpoint. The implementation modules endpoints, middleware, support and test_utils may change in a minor release, and so may the major version of a re-exported driver crate (mq_bridge::sqlx, mq_bridge::rdkafka, ...).

A minor release may add a configuration field, a variant of a configuration or error enum, and raise the minimum Rust version. Code that writes config structs with ..Default::default() and gives a match on these enums a _ arm compiles unchanged across such releases.

The minimum Rust version is 1.89. The features aws, sqlx and postgres-cdc, and so full, need 1.94.1; zeromq-omq needs 1.93.

Running Tests

The project includes integration and performance tests. Most backend tests require Docker.

To run the performance benchmarks for all supported backends:

cargo test --test integration_test --release -- --ignored --nocapture --test-threads=1

To run the criterion benchmarks:

cargo bench --features "full"

Criterion numbers vary with the machine they run on; for comparable throughput figures use the integration performance test above, or see the ETL benchmarks.

Contributing

Contributions are welcome. See CONTRIBUTING.md for setup notes, code style, and pull request guidelines.

AI Disclaimer

This library was written with a lot of AI assistance. The core started as my own code; many endpoints and docs were expanded with Gemini, CodeRabbit, Claude, and Codex, which made adding transports much faster once the endpoint traits were stable.

Generated code can look plausible while missing important details, so I review every commit manually, clean up and refactor the output, and rely on the integration suite to catch regressions. I trust the current code as much as if I had written it myself. Given the large feature set there may still be open issues; the current focus is testing and documentation.

License

mq-bridge is dual-licensed under either the MIT license or the Apache License, Version 2.0, at your option.

Binary distributions carry their applicable third-party terms in THIRD_PARTY_LICENSES.txt. Their current maintenance process is documented in docs/THIRD_PARTY_LICENSES.md.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in mq-bridge by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Available Tools

11 tools
bridge_statusA
Read-only

Report every mq-bridge process this user is running on this machine — CLI jobs (mqb copy, headless configs), other MCP servers, the web UI and the desktop app — with their routes and consumers: connector types, running/healthy, outcome, current rate (throughput), average_throughput, total messages (message_sequence), pending and started_at_ms. Read-only; routes of other processes cannot be stopped from here. The entry whose pid equals current_pid is this server. Error text of other processes is redacted to error.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true; the description adds substantial behavior beyond that — error text of other processes is redacted to `error`, the entry with `pid` == `current_pid` is this server, and other processes' routes cannot be stopped from here. This is exactly the kind of operational context an agent needs and cannot infer from 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.

Conciseness4/5

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

Front-loaded with the core scope statement, followed by two short, high-signal sentences. The middle enumeration of returned fields is dense and list-like, but each named field earns its place given the absence of an output schema.

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?

With no output schema, the description compensates by naming the fields returned per process and clarifying identity (`current_pid`) and the redaction behavior. Combined with the read-only note, an agent has everything needed to call and interpret this tool.

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 takes zero parameters, so the schema carries no semantics and the baseline is 4. The description instead documents the returned shape (`outcome`, `throughput`, `average_throughput`, `message_sequence`, `pending`, `started_at_ms`, `pid`), which adds meaning but sits outside the parameter dimension.

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?

States a specific verb+resource with clear scope: reports every mq-bridge process running for this user on this machine, explicitly enumerating CLI jobs, other MCP servers, the web UI and the desktop app. This distinguishes it from siblings like list_routes and route_status, which operate on routes rather than whole processes.

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?

Gives clear context for when this tool is the right one (cross-process inventory, including other MCP servers) and states a key exclusion: routes of other processes cannot be stopped from here, implicitly routing the agent to stop_route for its own routes. It does not, however, explicitly name the sibling tools or spell out the when-not conditions.

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

describeA
Read-only

Describe the endpoints and middlewares this build supports, the same data as mqb list --json / mqb describe <name> --json: each endpoint's endpoint type (the JSON key publish/start_route take), URI form, example and typed params (also its config fields), and each middleware's params. Pass name to narrow it to one entry.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoA scheme (`kafka`), alias, endpoint type (`sqlx`) or middleware (`retry`). Omit it for the whole catalog.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description goes further by detailing the shape of the payload (endpoint type, URI form, example, typed params, config fields, middleware params) and the CLI equivalence, which is meaningful behavioral context beyond the annotation.

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?

Front-loaded with the core purpose, then a single closing sentence on the parameter. The middle clause enumerating returned fields is dense but earns its place since there is no output schema.

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?

With no output schema, the description must carry the return-value burden, and it does so by enumerating the fields returned for each endpoint and middleware. Combined with the 100%-covered parameter and readOnly annotation, an agent has enough to invoke 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 coverage is 100% and the schema description already explains that name accepts a scheme, alias, endpoint type or middleware and that omission returns the whole catalog. The description only adds the 'narrow to one entry' framing, so it stays at the baseline of 3 when the schema does the heavy lifting.

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

Purpose4/5

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

The generic name 'describe' is rescued by the description, which states a specific resource: the endpoints and middlewares this build supports. It implicitly distinguishes itself from siblings like list_routes/server_info by framing itself as a catalog of available endpoint types and middleware, though it never names an alternative explicitly.

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

Usage Guidelines3/5

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

The description gives parameter-level usage ('Pass name to narrow it to one entry', 'Omit it for the whole catalog'), which implies the two modes of use. However, it never states when to prefer this over siblings such as list_routes or server_info, so the when-to-use guidance is only inferred.

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

generate_cli_commandA
Read-only

Generate a copyable, headless mqb command for a route. Accepts the same route JSON and tuning overrides as start_route, but does not start anything. The command embeds canonical JSON with POSIX shell quoting so fields that have no compact copy-URI representation are preserved. Credential values are replaced by environment variable placeholders and the required variable names are returned separately.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional route name in the generated configuration.
routeYesThe same route JSON accepted by `start_route`.
batch_sizeNoBatch size. Overrides a value inside `route`.
concurrencyNoRoute concurrency. Overrides a value inside `route`.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description adds substantial context: the command embeds canonical JSON with POSIX shell quoting to preserve fields lacking a copy-URI form, credential values become environment variable placeholders, and the required variable names are returned separately. This is meaningful behavior beyond the safety annotation, though the exact return shape is only implied.

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?

Three sentences, front-loaded with the core action and followed by the differentiator and the credential/quoting behavior. Every sentence carries weight; only marginally more could be trimmed.

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 read-only generator with no output schema, the description covers the essentials: what it produces, that it does not execute, and how credentials and non-URI-representable fields are handled. It conveys that variable names come back separately, which is the key return-value nuance, though a fuller picture of the returned command/variables would make it complete.

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 `name`, `route`, `batch_size`, and `concurrency`. The description ties the `route` parameter to `start_route`'s input and alludes to 'tuning overrides', but adds little syntax or meaning beyond what the schema provides; baseline 3 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?

States a specific verb (Generate) and resource (a copyable, headless `mqb` command for a route), and explicitly distinguishes itself from the sibling `start_route` by noting it 'does not start anything'. An agent can tell it apart from start_route and the other lifecycle tools without opening any schema.

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?

Clearly frames usage relative to `start_route`: it accepts the same route JSON and tuning overrides but produces a command instead of running one. This gives the agent the selecting condition, though it stops short of stating explicit when-to-use/when-not scenarios or other alternatives.

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

list_routesA
Read-only

List the routes started by this server, with their live connection health, total messages moved, current message rate, and achieved average rate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes that this is a safe, non-mutating operation, so the bar is lower. The description adds useful content context (connection health, message totals, current and average rates), but discloses nothing about freshness of the live metrics, whether routes from other servers are excluded, or any rate/pagination behavior.

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?

A single front-loaded sentence with a clear verb-resource opening and no redundant or filler content. Every clause adds information about what is returned.

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?

With no output schema, the description carries the burden of describing the response, and it does so by naming the four metric families returned. It is nearly complete for a zero-parameter read-only tool, though it omits whether results are paginated or scoped beyond the implied current server.

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 takes zero parameters, so per the rubric the baseline is 4 and there is no parameter semantics for the description to compensate for. The schema is empty and fully self-explanatory.

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

Purpose4/5

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

States a specific verb and resource ('List the routes') plus a scope qualifier ('started by this server'), and enumerates the returned metrics. It never names or contrasts with the closely related sibling route_status, so an agent must infer the distinction between listing all routes and querying one route's status.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance and no mention of alternatives such as route_status, wait_route, or route_messages. The enumeration use case is only weakly implied by the verb 'List'; nothing tells the agent when this is preferable to the sibling status tools.

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

publishA

Publish one message or a batch of messages to any endpoint. The endpoint is supplied inline in publisher as JSON keyed by type (e.g. {"kafka": {"url": "...", "topic": "..."}}); this is independent of routes. Provide either message or messages; each message has a payload and optional metadata headers (e.g. kind for the message type, correlation_id). Returns the send outcome (an acknowledgement, or the endpoint's reply for request/reply endpoints).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional label for this target, used to group sends in status reporting. Defaults to the connector type.
messageNoA single message to send.
messagesNoA batch of messages to send (alternative to `message`).
publisherYesTarget endpoint, keyed by connector type, e.g. `{"kafka": {"url": "localhost:9092", "topic": "orders"}}` or `{"file": {"path": "/tmp/out.jsonl"}}`.

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It usefully discloses the return behavior ('Returns the send outcome (an acknowledgement, or the endpoint's reply for request/reply endpoints)') and that the target is inline and route-independent. It says nothing about failure modes, permissions, or side effects of publishing.

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?

Four sentences, front-loaded with the core action, then the endpoint shape, the message/messages choice, and the return value. Reasonably tight with no filler, though the parenthetical example is somewhat long.

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 4-parameter publish tool with no output schema and no annotations, the description covers purpose, the inline publisher format, the message vs messages choice, and the return value. It omits error/failure behavior, which is a minor gap rather than a blocking one.

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 `publisher`, `message`/`messages`, and the payload/metadata fields. The description restates the `publisher` shape with an example and the message/metadata conventions that the schema's InputMessage and Endpoint defs already provide, adding little beyond the schema.

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

Purpose4/5

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

States a specific verb ('Publish') and resource ('one message or a batch of messages to any endpoint'), and the phrase 'independent of routes' implicitly distinguishes it from the route-based sibling route_messages. It stops short of naming that sibling explicitly, so the differentiation is suggestive rather than explicit.

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

Usage Guidelines3/5

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

It gives parameter-level usage ('Provide either `message` or `messages`') and notes the endpoint is independent of routes, which implies a context. But it never states when to choose this tool over route_messages or the other siblings, so usage is only implied.

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

route_messagesA
Destructive

Return the most recent messages captured on a route, newest last. Only routes started with capture_last capture anything. Reads are destructive: each message is returned once, so repeated calls yield only what arrived since the last call.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe route name.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true/readOnlyHint=false, but the description explains the mechanism behind that: each message is returned once and repeated calls yield only newly arrived messages. This is exactly the behavioral context annotations cannot convey, and it matches the annotations rather than 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, zero filler, and the ordering plus capture precondition are front-loaded before the destructive-read caveat. Every sentence carries distinct information.

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?

With no output schema, the description still discloses return ordering ('newest last') and the once-only return semantics, which is what an agent most needs here. Safety profile is covered by annotations and reinforced coherently by the text.

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?

One parameter with 100% schema description coverage ('The route name.'), so the schema already carries the meaning. The description adds no syntax or format detail for the name parameter; baseline 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?

States a specific verb and resource ('Return the most recent messages captured on a route') plus ordering ('newest last'), and the capture_last constraint scopes it away from status/list style siblings. An agent can tell what it fetches without opening the schema.

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?

Explains the precondition for any result ('Only routes started with capture_last capture anything') and warns that reads are one-shot, which strongly shapes when to call it. It does not name alternative tools (e.g. list_routes, route_status), so it stops short of explicit alternatives.

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

route_statusA
Read-only

Report the live status of one route (by name) or all routes: connection health, whether it has finished, the total number of messages it has moved, its current rate (messages_per_second), and the rate it achieved overall (average_messages_per_second over elapsed_s). Quote the average for a finished job: the current rate decays to ~0 once a route stops moving data.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoA specific route name; omit to report every running route.

TDQS

A4.3/5.0
Behavior4/5

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

With only readOnlyHint=true in annotations, the description adds meaningful behavioral context beyond safety: it specifies which metrics are returned (connection health, completion, message count, current rate, average rate) and warns that the current rate decays to ~0 after a route stops moving data, which is crucial for interpreting results correctly. It does not cover auth or rate limits, but the added output semantics are valuable.

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 front-loaded with purpose and then efficiently details the returned metrics, followed by a single practical caveat. Every clause earns its place, especially since there is no output schema to convey return values elsewhere.

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 status tool with one fully documented optional parameter, no output schema, and only a readOnlyHint annotation, the description is complete enough for an agent to invoke it correctly and interpret the response. It covers scope, returned fields, and a key interpretation caveat, leaving no critical gaps.

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 coverage is 100%, and the single optional `name` parameter is fully documented in the schema ('omit to report every running route'). The description restates that omitting the name reports all routes but adds no new syntax or format detail beyond the schema, so the baseline of 3 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 states a specific verb and resource ('Report the live status of one route ... or all routes') and enumerates the exact status fields, which clearly differentiates it from siblings like list_routes (listing) and stop_route/start_route (control). An agent can identify this as the read-only status-reporting tool without inspecting other schemas.

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 use: retrieve live status, either for one named route or all routes, and it includes interpretation guidance ('Quote the average for a finished job'). It does not explicitly name alternatives or exclude when-not-to-use, so it falls short of full routing guidance.

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

server_infoA
Read-only

Report this MCP server's build identity: crate version, git_hash (with a -dirty suffix if the working tree had uncommitted changes at build time), build profile (debug/release), and build_time. Use it to confirm which binary is actually running before trusting throughput numbers.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description provides deep behavioral context by detailing the exact elements reported: version, profile, build time, and crucially, the specific logic for the git_hash (including the '-dirty' suffix condition).

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 definition is highly concise, front-loading the main purpose and then efficiently detailing the specifics of the output in a clear, structured manner.

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?

Although there is no output schema, the description is perfectly complete by explicitly listing every piece of data returned and defining the logic behind that data (e.g., the conditional nature of the git_hash).

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?

Since the tool has zero parameters and the schema coverage is 100%, the description meets the baseline score for input parameter semantics.

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 clear verb ('Report') and identifies a specific resource ('MCP server's build identity'). It is distinct from its siblings, which are primarily operational or routing tools.

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 explicit guidance on when to use the tool ('to confirm which binary is actually running before trusting throughput numbers'). While it doesn't compare it to a sibling, the defined use case is highly specific.

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

start_routeA
Destructive

Create and run a route that moves messages from its input (source) endpoint to its output (sink) endpoint, each keyed by connector type. Supports route options like concurrency, batch_size, and exit_on_empty (drain the source then exit; otherwise the route runs continuously until stopped). Either endpoint may carry a middlewares array — retry, dlq, deduplication, limiter, transform, compression, encryption, pack/unpack, buffer, delay, timeout, weak_join, cookie_jar, metrics — e.g. {"sqlx": {...}, "middlewares": [{"retry": {"max_attempts": 3}}]}. concurrency/batch_size may be given inside route or as top-level arguments — the top-level argument wins, and an unset value becomes the app default (4 / 1024, or the batch size the output endpoint's schema declares). Returns the route name for use with wait_route / route_status / stop_route, plus the tuning that took effect.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional unique route name (auto-generated if omitted).
routeYesThe route to run: an `input` (source) endpoint and an `output` (sink) endpoint — each keyed by connector type, e.g. `{"input": {"nats": {"url": "localhost:4222", "subject": "orders"}}, "output": {"file": {"path": "/tmp/out.jsonl"}}}` — plus route options such as `exit_on_empty` (drain the source then exit), `concurrency` and `batch_size`. Use `{"null": null}` as the `output` to discard messages. A `file`/`object_store` source must repeat the `compression`/`encryption` its data was written with — neither is auto-detected, and a mismatch ends the route as `completed` having moved few or no messages rather than failing, so check the moved-message count.
batch_sizeNoBatch size. Overrides `batch_size` inside `route` if both are given; if neither is given, the output endpoint's own schema default applies if it declares one, else the app default (1024), not the library's 512.
concurrencyNoRoute concurrency. Overrides `concurrency` inside `route` if both are given; if neither is given the app default (4) applies, not the library's 1. Higher values parallelize sink writes; sources that read serially do not speed up.
capture_lastNoKeep the last N messages that flow through this route, readable with `route_messages`. Omit (or 0) to capture nothing, which is the default — captured payloads are held in memory and returned to the model verbatim.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare `readOnlyHint=false` and `destructiveHint=true`, so the writing nature of the tool is covered by structured data. The description adds useful behavior: the route runs continuously until stopped unless `exit_on_empty` is set, and it returns the tuning that took effect. It stops short of disclosing startup failure modes, connection requirements, or what happens to existing routes of the same name.

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?

A single dense paragraph that front-loads the core action before the option/middleware detail. Every sentence carries information, though the middleware enumeration and the worked example make it longer than strictly needed for selection.

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?

No output schema exists, yet the description covers the return value (route name plus the effective tuning). For a 5-parameter tool with deeply nested endpoint configs it is nearly complete, with the only real gap being the `capture_last` parameter, which is left entirely to the schema.

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 schema carries the per-field detail, but the description still adds the cross-field rule (top-level `concurrency`/`batch_size` wins over the in-`route` value, and an unset value becomes the app default 4/1024). It also enumerates the middleware set inline, which helps the agent compose a valid endpoint without drilling into `$defs`.

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?

States a specific verb+resource pair ('Create and run a route') and immediately scopes it as moving messages from an `input` endpoint to an `output` endpoint. It distinguishes itself from the stop/status siblings by describing the creation-and-run action and returning the route name for use with `wait_route` / `route_status` / `stop_route`.

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?

Provides clear lifecycle context: it names the follow-up tools that consume the returned route name, and explains `exit_on_empty` as the toggle between drain-and-exit and continuous operation. It does not, however, state when to prefer this over siblings like `publish` or `generate_cli_command`, and offers no explicit exclusions.

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

stop_routeA

Stop a running route by name. Returns the total messages it moved plus the rate it achieved (average_messages_per_second over elapsed_s).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe route name.

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full behavioral burden. It usefully discloses the return payload (total messages moved, average_messages_per_second over elapsed_s), which compensates somewhat for the missing output schema, but says nothing about behavior when the route is not running, idempotency, or error/permission conditions.

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 tight sentences with zero filler; the operation is front-loaded and the return semantics follow immediately. Every clause 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?

With no output schema, the description steps in to describe the return values, and the single parameter is fully covered by the schema. Only failure modes and preconditions (e.g., what happens if the route is already stopped) are left unaddressed.

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?

There is a single parameter with 100% schema description coverage ('The route name'), so the schema already documents it. The description adds no format, uniqueness, or naming-convention detail beyond 'by `name`', making the baseline 3 appropriate.

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

Purpose4/5

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

The description states a specific verb+resource ('Stop a running route') and names the identifying parameter (`name`), which is unambiguous against siblings like list_routes or route_status. It does not explicitly contrast itself with start_route, but the operation is self-evident.

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

Usage Guidelines3/5

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

Usage is implied by 'a running route' — the agent can infer this applies only to an active route, and start_route is the obvious counterpart. However, no explicit when-to-use/when-not-to-use guidance or named alternative is provided.

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

wait_routeA
Read-only

Block until a route finishes, then report how it ended. Use this instead of polling route_status for a job started with exit_on_empty: it costs one tool call regardless of how long the job runs. Returns finished (false if timeout_ms elapsed first — the route is left running), the outcome, the total messages moved and the rate achieved. An outcome of failed carries the cause in error. Default timeout 60000 ms, maximum 18000000 ms.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe route name.
timeout_msNoHow long to wait before giving up and returning `finished: false`, in milliseconds. Defaults to 60000; values above 18000000 are clamped. The route keeps running when the wait times out.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint, so the description carries the rest and does so well: the route is left running on timeout, `finished: false` signals the timeout case, and a `failed` outcome carries the cause in `error`. It also discloses the blocking semantics and timeout limits, which are behavioral traits beyond the safety hint.

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?

Four dense, front-loaded sentences with no filler; the core behavior and the sibling routing come first. The final sentence restating the timeout default/maximum duplicates schema content and is the one slightly redundant line.

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?

There is no output schema, so the description takes on the return-value burden and covers it: `finished`, `outcome`, messages moved, rate achieved, and error propagation. Combined with the timeout semantics, an agent has everything needed to call and interpret this 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 coverage is 100%, and the timeout default, clamp, and 'route keeps running' semantics are already documented in the schema's own parameter description. The description largely repeats that, though it does tie `timeout_ms` to the returned `finished: false`. Baseline 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?

States a specific verb and resource — block until a route finishes, then report the outcome — and explicitly distinguishes itself from the polling sibling `route_status`. An agent can pick this over `route_status` without opening either schema.

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?

Gives an explicit when-to-use ('a job started with `exit_on_empty`') and a named alternative to avoid ('instead of polling `route_status`'), plus the rationale (one tool call regardless of duration). Nothing is left to inference.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv1.0.3
    • First observedbridge_status
    • First observeddescribe
    • First observedgenerate_cli_command
    • First observedlist_routes
    • First observedpublish
    • First observedroute_messages
    • First observedroute_status
    • First observedserver_info
    • First observedstart_route
    • First observedstop_route
    • First observedwait_route

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target clearly distinct actions (start/stop/wait routes, publish, describe, generate_cli_command). However list_routes, route_status, and bridge_status all overlap on reporting route health/throughput, differing mainly in scope (this server vs. all processes, one vs. all routes), which could cause misselection.

Naming Consistency3/5

Conventions are mixed: verb_noun appears in list_routes, start_route, stop_route, wait_route, generate_cli_command, while noun_verb forms appear in route_status, route_messages, server_info, bridge_status, plus bare verbs like publish and describe. It's still readable but not a single predictable pattern.

Tool Count5/5

11 tools is well-scoped for a message-bridge server: route lifecycle, message inspection, publishing, and introspection each earn their place without bloat or redundancy.

Completeness4/5

Route lifecycle is well covered (start, stop, wait, status, message capture, list, CLI generation) plus publish, describe, and identity info. Minor gaps exist, e.g. no explicit route teardown/purge beyond stop_route, but core workflows are complete.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server with 32 tools for ETL ingestion, AI-generated data quality rules, AI transformations, vector search, and natural-language SQL. Works across Postgres, MongoDB, Kafka, S3/MinIO, HashiCorp Vault, and five vector stores (Qdrant, Weaviate, Milvus, Chroma, pgvector).
    12
    AGPL 3.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables querying and mutating data across multiple sources (CSV, Google Sheets, SQLite, PostgreSQL, MySQL, MongoDB, Oracle) through a dynamic GraphQL API, with flexible filtering, batching, persisted queries, and dynamic source switching.
    8
    5 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Turn PostgreSQL, MySQL, MariaDB, SQL Server, Oracle, SQLite or Snowflake into MCP tools and a REST API, with API keys and per-table role-based access.
    8
    163
    MIT