Skip to main content
Glama
wiz-abhi

signoz-funnel-mcp

by wiz-abhi

Funnel of Thought — a counter measures presence, a funnel measures sequence

Funnel of Thought

ci tests SigNoz license

An AI agent that watches itself think — and tells you the exact step where it stopped.

Watch the 3-min demo · Try it live · Read the blog

The cognition funnel: 125 runs start, 80 reach validate in order

plan → tool → validate → respond is a contract. Most agents are trusted to honour it and never measured against it. Funnel of Thought measures it, as a conversion funnel, in SigNoz, live — and ships the funnel MCP tools that let the agent run that measurement over its own traces without a human in the loop.

The 30-second version

My agent has a validation step. A dashboard said it ran in 100% of runs. A funnel over the same 125 traces said 64%.

Counter says 100%, funnel says 64%, gap 36pp

Both queries are correct. They answer different questions — and 45 runs emitted their validate span before the tool result existed, so the agent validated an answer that had not arrived yet. Every presence-based metric you own scores those runs as a success.

A counter measures presence. A funnel measures sequence. Only one of those is the contract.

One trace, two readers: the counter says 100%, the funnel says 64%

The read path is deterministic REST over spans that already landed. No LLM sits between you and the answer, so building a funnel and reading it back is a sub-second operation you can repeat while the agent is still running. Inject a validation regression and watch the validate bar sink and the alert fire while you are still looking at the screen.

SigNoz already markets Trace Funnels for exactly this shape of problem — tracking "drop-offs across your AI agent pipelines." As far as I can find, it is the only trace-native funnel primitive in an open-source APM, and they pointed it at agents first. This project is the adapter that makes that pairing work on a stock-OpenTelemetry agent, plus the five MCP tools that make it reachable from inside one.


Related MCP server: dat-ai-mcp

The problem

Every LLM-observability tool shows you traces — Langfuse, LangSmith, Phoenix, Braintrust. Checking their docs in July 2026 I could not find a funnel primitive in any of them: a way to ask "of the runs that started reasoning, what fraction completed each step, in order?" SigNoz has one. (Corrections welcome — that claim is about what I could find documented, not a proof of absence. Datadog ships funnel analysis for RUM, but over page views, not spans.) Pointing it at a spec-compliant agent needs things I could not find written down anywhere. Building this surfaced six of them — the blog has the full story; in short:

  • Steps match on the exact span name — no wildcards. The name you pick is load-bearing.

  • OTel's GenAI convention puts the model inside the span name (chat gemini-3.1-flash-lite), so one logical step fragments across N names on any model swap, and the funnel silently reads 0%. Two correct specs, quietly incompatible.

  • A zero-match step returns HTTP 500: unsupported value: NaN from the overview endpoints, while /analytics/steps returns a clean 0 — so through the endpoint the charts use, a broken funnel is indistinguishable from an honest 0%. The NaN comes from aggregates over an empty set (avgIf/quantileIf), not from the conversion division, which is already guarded. Filed as #12143.

  • latency_type: "p50" silently returns p99 (measured: p50 = p99 = 18.67, p90 = 17.96). Filed as #12220 with PR #12221.

  • Funnels need strictly increasing timestamps — steps inside one clock tick collapse to ~0 and 500. The single most useful undocumented thing we learned.

  • 0 of SigNoz's 41 MCP tools touch funnels — so signoz-funnel-mcp ships the five that do. Verify it yourself against the live server rather than taking my word: python scripts/mcp_gap.py --list, also asserted as step 5 of reproduce.sh.

The boundary that isn't a bug: funnels are minIf + monotonic — they see first occurrence and enforce order, so they're blind to loops and retries. That's not fixable and defines where the instrument applies: funnel the linear contract; loops want a graph.


It runs in SigNoz, not just in my terminal

The funnel is a real SigNoz object — the CLI and SigNoz's own UI agree to the decimal:

SigNoz Funnels UI showing the cognition funnel at 64.00% conversion

And the violation is visible in a single trace — agent.validate in red, finishing before the agent.tool call whose output it was supposed to check:

Trace waterfall: plan, validate (red, out of order), tool, respond


Architecture

Architecture sketch: agent to OTLP to SigNoz, fanning out to the CLI, the MCP server, and a dashboard + alert

A 4-node Gemini agent emits stock-OTel spans → SigNoz (cast by Foundry) stores and funnels them → the fot CLI, signoz-funnel-mcp, and a dashboard + alert read the result. Everything past the agent is deterministic — zero LLM calls at runtime. The loop closes when the agent calls get_funnel_analytics through the MCP server and reads its own conversion rate — the hop that didn't exist before, because no MCP tool reached funnels.


Quickstart

Needs: Docker and Python 3.11+. A Gemini key is optional — with no key everything below runs in --stub mode: identical span shape, zero LLM calls, seconds instead of minutes. Windows: scripts/setup.ps1 is a full port of setup.sh; reproduce.sh needs Git Bash.

git clone https://github.com/wiz-abhi/funnel-of-thought && cd funnel-of-thought
foundryctl cast                       # SigNoz + its MCP server (casting.yaml, pinned v0.132.2)
# create the admin account at http://localhost:8080, then:
cp .env.example .env                  # optional: set GEMINI_API_KEY for live latencies
python -m venv .venv && source .venv/bin/activate    # Windows: .venv\Scripts\Activate.ps1
pip install -e ".[all]"
./scripts/setup.sh                    # token, traces, funnels, dashboard, alert, gauges
fot show                              # the cliff, n on every bar
fot counter-proof                     # naive counter beside the ordered funnel

No foundryctl? docker compose -f pours/deployment/compose.yaml up -d (the committed forge output). Funnel writes need an editor JWT, not an API key — scripts/setup.sh --token mints one into .env (re-run on a 401; access tokens expire in ~30 min). foundryctl cast runs forge first, which rewrites pours/. Verified on foundryctl v0.2.11: the regenerated output is byte-identical to what is committed here, so cast leaves a clean git tree. If you already have SigNoz containers from another project, cast will stop on a name conflict — remove the stale container it names and re-run.

The judge path — five assertions, ~2 minutes:

./scripts/reproduce.sh

Measured end to end at 1m43s on a laptop. It generates a two-model batch, builds the funnels, prints the working cliff, reports the missing-vs-misordered split, points the fragmented funnel at a bumped model version and shows the 500: unsupported value: NaN verbatim, then measures SigNoz's own MCP server and confirms 41 tools, 0 reaching funnels. It maintains a failure counter and exits non-zero if any assertion fails.

It generates with --stub by default even when a Gemini key is present — free-tier pacing is 12 RPM across 3 calls per run, so 60 traces live is ~15 minutes. Every assertion is about span order and span names; none reads a model's output, so the results are identical. --live opts into real model latencies in the waterfall and costs the extra ~14 min. --no-gen reuses traces already in SigNoz (~20s).

What it does and doesn't prove. The drop-off rate is injected, not discovered: --validate-rate 0.64 decides how many runs honour the contract, and the funnel's job is to recover 64% from the traces alone while a presence counter insists on 100%. That makes this a calibration harness, and the known injection rate is exactly what makes the counter's answer demonstrably wrong rather than merely suspect. What is not authored is the span-name fragmentation: stock OpenTelemetry named those spans and an ordinary version bump did the rest.

Run the tests (no SigNoz, no Docker, no key needed):

pytest -q

MCP (Claude Desktop / Code / Cursor): point a signoz-funnel server at signoz-funnel-mcp with SIGNOZ_URL + SIGNOZ_JWT, then ask "build a funnel over my agent's reasoning steps and tell me which step is losing traces." Five tools: create_funnel, get_funnel_analytics, get_funnel_slow_traces, list_funnels, delete_funnel. Config in signoz_funnel_mcp/README.md.

How it uses SigNoz

Remove SigNoz and this project cannot exist — there is no funnel primitive anywhere else to port to. Every surface is load-bearing:

Surface

How it's used

Traces

Stock-OTel agent spans are the raw material every funnel is computed over.

Trace Funnels

The core primitive and the product — two funnels over one dataset (stable node spans → the cliff; the GenAI chat {model} span → 0% → 500). Reaches below the UI into the generated ClickHouse SQL.

Query Builder

The counter-proof: GROUP BY span name reports validate at ~100% while the ordered funnel reports 64%.

Metrics

Per-step conversion re-emitted as OTel gauges, turning a point-in-time funnel into a monitorable time series.

Dashboards + Alerts

Dashboard-as-code charts validate-conversion; a threshold rule fires when it drops — what makes the live demo live.

MCP

signoz-funnel-mcp ships the five funnel tools that 0 of the 41 existing tools provide, so an agent can build and read a funnel over itself.

What's novel

  • A funnel over cognition, not commerce — pointing Trace Funnels at an agent's reasoning contract. I found no prior worked example of this on a stock-instrumented agent.

  • The five missing MCP tools — an agent could reach every SigNoz surface except the one that measures its own completion rate. Now it can.

  • A named, reproducible incompatibility between two correct specs — OTel GenAI says a span name describes the model; Trace Funnels say it identifies a step. Together they silently produce 0%. Generalises to any exact-match matcher.

  • Pre-registrationPREDICTION.md committed before any data was read, with falsification criteria and a control funnel. The drop-off is attributable, not asserted.

  • Speed as the feature — no LLM on the read path, so build → read → change → read runs sub-second on live data. That's what lets an agent measure itself in real time.

AI usage disclosure

Per the hackathon rules: Claude Code was used as a development assistant — scaffolding, reviewing the ClickHouse/Go analysis behind the NaN diagnosis, and editing prose here and in the blog. Every architectural decision, both bug diagnoses, and every claim of fact were made and verified by a human against a live SigNoz instance.

No AI writes to the shipped runtime — the MCP server, CLI, dashboard and alert make zero LLM calls; pure REST plus arithmetic. The only model in the system is the one being observed: agent/ calls free-tier Gemini offline to generate the traces the funnel measures. Swap it for any OTel-instrumented agent and everything else works unchanged. All project code was written after the hackathon opened on 2026-07-20.

Limitations

  • Funnels can't see loops. minIf + monotonic step index → first occurrence wins, order enforced, so retry storms are invisible. A real ceiling on the primitive, not our code; a loop-aware graph view is the natural complement (funnel the linear contract; loops want a graph).

  • The observed agent is authored — we wrote the 4-node agent for a clean validate node, and say so. What's not authored is the defect: stock OTel named the spans and an ordinary model swap did the rest. "Unauthored defect," never "unauthored agent."

  • Exact-name matching is a constraint, not a bug — it's what keeps the query fast. The lesson: key funnels on names that are identities (agent.validate), not descriptions (chat gemini-3.1-flash).

  • Single-service scope — every funnel here is over one service.name; cross-service is untested.

  • Upstream is open, not merged#12143 filed + diagnosed; #12220 + PR #12221 for the p50 bug. Described as filed/open/proposed throughout — never merged.

Repository layout

agent/                4-node LangGraph agent + batch trace generator
signoz_funnel_mcp/    MCP stdio server — the five missing funnel tools (+ tests/)
fot/                  core library + `fot` CLI (+ tests/)
web/                  the hosted demo page (FastAPI + a static build)
dashboards/           dashboard-as-code (SigNoz v5 schema)
alerts/               drop-off threshold alert
scripts/              setup.sh / setup.ps1 / reproduce.sh
blog/                 the write-up, its figures, and the video toolchain
docs/media/           README banner, hero GIFs, architecture sketch
spikes/               findings from the exploratory phase
.github/workflows/    CI: tests + lint on Linux and Windows, no SigNoz needed
casting.yaml          Foundry installation spec  (committed)
casting.yaml.lock     forged lockfile            (committed)
pours/                forged deployment manifests (committed)
docker-compose.yml    OUR containers, joined to signoz-network
PREDICTION.md         pre-registered hypotheses, committed before data

131 unit tests, none of which need SigNoz, Docker, or an API key: pytest -q. CI runs them plus ruff on Linux and Windows, and asserts that the --json contract scripts/reproduce.sh parses still exists — the wiring bug that class of test is there to prevent.


Acknowledgements

To the SigNoz team, for building the funnel primitive nobody else in open-source APM seems to have, and for making the source readable enough that both bugs here could be root-caused from it in an afternoon. To kunalpandey1 for PR #12160. To WeMakeDevs and SigNoz for the Agents of SigNoz hackathon.

License

MIT.

Available Tools

5 tools
create_funnelA

Create a SigNoz trace funnel and set its steps in a single call.

This wraps two REST calls (POST /new then PUT /steps/update) and handles the undocumented requirements that make hand-rolling them fail: millisecond timestamps on both, the mandatory timestamp on the update, and omitting each step's id so SigNoz mints a valid UUID. If setting steps fails, the empty funnel is deleted rather than left behind.

Args: name: Funnel name, e.g. "agent-tool-pipeline". steps: Ordered list of at least 2 steps. Each is a dict with:

    * ``service`` (required) -- the service name as it appears in traces
    * ``span`` (required) -- the exact span name
    * ``name`` (optional) -- friendly label for charts
    * ``latency_type`` (optional) -- ``"p90"``/``"p95"``/``"p99"``
      (default ``p99``; **``p50`` is not implemented by SigNoz** and
      silently yields p99 -- you will get a warning back)
    * ``has_errors`` (optional) -- only match errored spans

Example::

    [{"service": "frontend", "span": "GET /cart", "name": "browse"},
     {"service": "payments", "span": "charge", "name": "pay"}]

Returns: funnel_id, the normalized steps, and any warnings.

Note: All steps must occur within the same trace. SigNoz matches the first occurrence of each step and enforces order, so funnels cannot see loops or retries.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
stepsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden, and it excels. It exposes concrete implementation details: millisecond timestamps, mandatory 'timestamp' in update, omitting step 'id' to let SigNoz generate UUID, automatic cleanup of empty funnels on failure, and the caveat that 'p50' silently yields p99. This is far beyond what a typical tool description provides.

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?

Although lengthy, the description is well-organized with clear sections (Args, Returns, Note) and an example. Every sentence adds value—explaining undocumented requirements, defaults, and edge cases. There is no fluff, and the structure allows an agent to quickly locate parameter details and behavioral notes.

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?

The tool is complex (wrapping two REST calls, with tricky requirements), yet the description covers all significant aspects: purpose, parameters, return values, error handling, and limitations. The presence of an output schema is not necessary because the description already outlines what is returned (funnel_id, steps, warnings). It leaves no major gaps for an agent to fill.

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

Parameters5/5

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

The input schema is minimal (name and steps, with steps as a generic array of objects). The description compensates fully by specifying each required and optional field inside a step (service, span, name, latency_type, has_errors), defaults, examples, and the meaning of 'latency_type' with the p50 caveat. It also gives a concrete example of the steps array, making parameter usage unambiguous.

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

Purpose5/5

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

The description clearly states the tool's primary function: 'Create a SigNoz trace funnel and set its steps in a single call.' It names the specific resource (SigNoz trace funnel) and the verb (create/set), which distinguishes it from siblings like list_funnels, delete_funnel, and analytics tools. No ambiguity.

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

Usage Guidelines4/5

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

It explains the tool's scope by noting it wraps two REST calls and handles undocumented requirements, which implies this is the recommended way to create funnels. It also gives a key limitation: 'All steps must occur within the same trace' and that funnels cannot see loops/retries. However, it doesn't explicitly compare to alternatives or say 'use this when X'—though siblings are clearly different operations, so the guidance is adequate.

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

delete_funnelA

Permanently delete a trace funnel by id.

Irreversible. Use list_funnels first to confirm you have the right id.

ParametersJSON Schema
NameRequiredDescriptionDefault
funnel_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It clearly discloses the most critical behavioral trait: irreversibility ('Permanently delete' and 'Irreversible'). It stops short of describing permissions, error handling, or scope of deletion, but for a simple delete tool, this is solid coverage.

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

Conciseness5/5

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

Two short sentences, with the action front-loaded and the warning immediately following. Every word earns its place, and the structure is highly efficient.

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

Completeness4/5

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

Given the simple one-parameter nature, the presence of an output schema, and the explicit irreversibility warning, the description is nearly complete. It could add details about permissions or failure outcomes, but these are not essential for a straightforward delete tool. The guidance to list first adds valuable context.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It indirectly explains funnel_id by saying 'by id' and recommending list_funnels to confirm the id. However, it does not explicitly describe the id format or provide details beyond the schema's title. For a single, self-explanatory parameter, this is adequate but not outstanding.

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 exactly what the tool does: 'Permanently delete a trace funnel by id.' It uses a specific verb (delete), identifies the resource (trace funnel), and clearly distinguishes from sibling tools like list_funnels and create_funnel.

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?

Explicit guidance is provided: 'Use ``list_funnels`` first to confirm you have the right id.' This tells the agent when to use this tool relative to an alternative and even gives a prerequisite step, making usage clear.

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

get_funnel_analyticsA

Measure a funnel: per-step conversion with trace counts, plus end-to-end metrics.

Identify the funnel by either funnel_id or funnel_name.

Every step row carries an explicit n (number of traces reaching that step) alongside its conversion percentages, so any chart built from this can label each bar with its sample size.

Args: funnel_id: The funnel's UUID. funnel_name: Its name (resolved to an id for you). Ignored if funnel_id is given. time_range: Relative window like "30m", "24h", "7d", "2w". Converted to the nanosecond bounds the API needs.

Returns: steps (one row per step: n, errors, conversion_from_previous_pct, conversion_from_start_pct, dropped_from_previous), end_to_end metrics, and totals.

Note: When zero traces complete a step, SigNoz returns HTTP 500 unsupported value: NaN instead of a 0% result (SigNoz issue #12143). This tool detects that and reports a clean zero, flagged via end_to_end.zero_trace_fallback.

If a step shows 0 traces, read ``diagnostics``. Besides a wrong span
name, the usual culprit is that SigNoz enforces step ordering
**strictly** (``t_next > t_prev``): spans that complete within the same
clock tick -- instantaneous no-ops -- are not counted as ordered and
will silently under-count even when the sequence is correct.

``end_to_end.errors`` is a MAX across steps, not a sum, and its
``latency`` is hardcoded to p99 by SigNoz -- both are restated in
``end_to_end.caveats``.
ParametersJSON Schema
NameRequiredDescriptionDefault
funnel_idNo
time_rangeNo24h
funnel_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses the SigNoz HTTP 500 NaN bug and zero_trace_fallback, the strict step ordering causing under-counts, the semantics of errors as a MAX, and latency hardcoded to p99. These are behavioral insights far beyond a basic operation description.

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 structured with Args, Returns, and Notes sections, keeping details organized and front-loaded. Every sentence provides useful information, including edge-case caveats, without fluff. It is appropriately sized for the tool's complexity.

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?

Despite having an output schema (per context signals), the description still explains the return structure, parameter semantics, and critical gotchas. For a tool with this complexity—two identifying parameters, time-range conversion, and known SigNoz quirks—the description is fully complete and self-sufficient.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must explain all parameters. It does so completely: funnel_id (UUID), funnel_name (resolved to id, ignored if id given), and time_range (with examples and note about nanosecond conversion). This adds significant meaning beyond the bare schema properties.

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

Purpose5/5

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

The description opens with "Measure a funnel: per-step conversion with trace counts, plus end-to-end metrics," a specific verb+resource that clearly states what the tool does and distinguishes it from sibling tools like list_funnels, create_funnel, and get_funnel_slow_traces. The name and description together make the tool's function unambiguous.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool ('Measure a funnel...') and explains identification via funnel_id or funnel_name. It does not explicitly mention alternatives or when not to use this tool, but the context is sufficiently clear, so it meets the 'clear context, no exclusions' bar.

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

get_funnel_slow_tracesA

Fetch the slowest traces for one step transition of a funnel.

Use this after get_funnel_analytics shows a drop-off or a high latency between two steps -- it gives you concrete trace ids to open in SigNoz.

Args: funnel_id: The funnel's UUID. funnel_name: Its name, as an alternative to the id. time_range: Relative window, e.g. "24h". step_start: 1-based index of the transition's first step. step_end: 1-based index of its second step. Must differ from step_start.

Returns: Up to 5 rows of {trace_id, duration_ms, span_count}, plus error_traces sampled from the same transition.

Note: At most 5 rows. SigNoz hardcodes ORDER BY duration_ms DESC LIMIT 5; there is no way to page or raise it. The query is also pairwise -- it measures step_start to step_end only, not the whole funnel.

ParametersJSON Schema
NameRequiredDescriptionDefault
step_endNo
funnel_idNo
step_startNo
time_rangeNo24h
funnel_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description fully discloses behavioral constraints: the hardcoded ORDER BY duration_ms DESC LIMIT 5 with no paging, the pairwise nature of the query, and the return shape including error_traces. This is exactly the kind of non-obvious behavior an agent needs.

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 a one-sentence summary, then organized into Args, Returns, and Note sections. Each sentence adds necessary context; the length is justified by the tool's complexity and the lack of annotations.

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?

The output schema is present (as indicated by context signals), but even without it, the description states the return format (up to 5 rows of trace_id, duration_ms, span_count plus error_traces) and key limitations. Combined with parameter semantics and usage guidance, it is fully contextual for an agent to select and invoke this tool.

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

Parameters5/5

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

Schema coverage is 0%, but the description defines all 5 parameters with meaningful semantics: funnel_id as UUID, funnel_name as alternative, time_range as relative window ('24h'), and step_start/step_end as 1-based indices with the constraint that they must differ. This fully compensates for the bare schema.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Fetch the slowest traces for one step transition of a funnel.' It clearly differentiates from siblings by positioning itself as the follow-up to get_funnel_analytics, providing trace IDs rather than analytics.

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?

Explicitly states when to use: 'Use this after get_funnel_analytics shows a drop-off or high latency between two steps.' It also clarifies scope (pairwise transition not whole funnel) and row limits, but does not explicitly name alternatives or when not to use it.

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

list_funnelsA

List every SigNoz trace funnel, with its id, name, and step definitions.

Start here when you have a funnel name but need its id, or to check whether a funnel already exists before creating a duplicate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It transparently explains that it lists all funnels and what fields are returned, which is a strong signal of a read-only operation. However, it does not mention potential limitations (e.g., pagination, filtering, auth) or whether 'every' truly means all across all scopes, leaving a minor gap. Still, for a zero-parameter list tool, the transparency is solid.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose and output, followed by a precise usage hint. Every word earns its place with no fluff or repetition.

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

Completeness5/5

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

For a simple list operation with zero parameters and an output schema, the description covers purpose, scope, and usage context sufficiently. The output schema handles return details, so the description does not need to explain them further. The explicit 'Start here' guidance ties it well to the sibling-tool context.

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

Parameters4/5

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

The tool has zero parameters, and the description naturally omits parameter details. Per the rubric, a baseline of 4 applies when there are no parameters to describe, and this description does not need to compensate for any schema gaps.

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

Purpose5/5

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

The description clearly states the action ('List every SigNoz trace funnel') and the specific resource, including the returned fields (id, name, step definitions). It also differentiates from sibling tools by framing the use case ('need its id', 'check whether a funnel already exists before creating a duplicate'), which implies a read-only listing versus the create/delete/analytics tools.

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?

Explicitly states when to use this tool: 'Start here when you have a funnel name but need its id, or to check whether a funnel already exists before creating a duplicate.' This provides clear situational context and implicitly contrasts with the create_funnel sibling, satisfying the when/alternatives guidance.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedcreate_funnel
    • First observeddelete_funnel
    • First observedget_funnel_analytics
    • First observedget_funnel_slow_traces
    • First observedlist_funnels

TDQS

A4.7/5.0
Disambiguation5/5

Each tool has a distinct, non-overlapping purpose: listing, creating, deleting, analyzing, and fetching slow traces. The descriptions clearly differentiate the data returned and the actions performed, leaving no ambiguity about which tool to select.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern: list_funnels, delete_funnel, create_funnel, get_funnel_analytics, get_funnel_slow_traces. This makes the tool's action and target predictable across the entire set.

Tool Count5/5

Five tools is well-scoped for a funnel management server, covering core operations (list, create, delete) plus analytical queries (analytics, slow traces). No redundant or missing tools that would undermine the set's focus.

Completeness4/5

The set provides create, read, and delete functionality, plus analytics and slow traces. The only notable gap is the lack of an update operation to modify an existing funnel's steps or name, which could be worked around by delete and recreate but is not ideal.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wiz-abhi/funnel-of-thought'

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