Skip to main content
Glama

AgentKit — A Governed MCP Tool Server

CI License: AGPL v3 AgentKit MCP server – quality score on Glama Live App Research Benchmarks Guide

An MCP server where tools are declarative, effects are typed, and every action is policy-gated and audited — usable by any MCP client (Claude Desktop, Cursor, LangGraph, Claude Agent SDK, CrewAI).

Live Application: agentkit.ysiddo-ai-projects.app.

Three things distinguish it from a typical MCP server:

  • Declarative tools — define tools in YAML over your own Postgres or HTTP API. No Python, no fork. (docs/REUSE.md)

  • Real actions, not just reads — tools declare an effect (read / write / destructive) and mutating tools genuinely mutate.

  • Guardrails that hold regardless of the prompt — writes are off by default, destructive actions need a human-held approval token the model never sees, everything supports dry-run, and every call (allowed and denied) is audited. (SECURITY.md)

The bundled business-intelligence tools below are the reference pack that demonstrates all of this — not the limit of what the server does.

What It Does

Reference BI pack (built in):

  • 6 core MCP tools: query_kpis, get_company_health, detect_kpi_anomalies, forecast_metric, list_available_metrics, get_executive_summary — plus any tools loaded from declarative YAML packs (packs/), so the real tool count at runtime is 6 or more, not a fixed number. The bundled annotations pack adds 3 more (list_annotations, annotate_metric, retract_annotation) demonstrating a guarded write/destructive path — see below.

  • 10 MCP resources: kpi://{domain}/latest for each of this project's real seeded domains — Finance, People, Operations, Customer, Engineering, Growth, Logistics, ESG, IT, Security (src/agentkit_mcp/data/seed.py).

  • 1 reusable prompt: monthly_executive_briefing

The domain list, tool-pack set, and resource/prompt registration are all derived from the same data this server serves (src/agentkit_mcp/data/seed.py, packs/*.yaml), not hardcoded, so adding a domain or tool pack extends this list automatically. You can also add your own @mcp.resource / @mcp.prompt decorators. See docs/REUSE.md.

Write and destructive actions are real, not aspirational. The annotations pack lets an agent record a durable note on a metric (annotate_metric, effect write) and soft-delete one it got wrong (retract_annotation, effect destructive — requires a human-held AGENTKIT_APPROVAL_TOKEN the model never sees). Both are off by default (AGENTKIT_ALLOW_WRITES=false) — see SECURITY.md and RESEARCH.md §2 for the full policy-engine model.

Platform capabilities:

  • Declarative tool packs — add tools over your own Postgres/HTTP in YAML (packs/)

  • Typed effects + policy engine — GET /api/policy publishes the capability envelope

  • Audit trail — GET /api/audit, allowed and denied, with deny reasons

  • Multi-provider LLM routing incl. self-hosted — GET /api/llm-routing

  • LangGraph 3-agent workflow in workflow.py (Planner → Analyst → Reporter)

  • Claude Agent SDK demo in demos/claude_agent_sdk_demo.py

  • CrewAI demo in demos/crewai_demo.py

  • DSPy research scaffold in research/dspy_experiment.py

  • 67 tests across smoke, API, integration, MCP protocol, policy guardrails, and LangGraph workflow

Related MCP server: autonomad-travel

PyPI Package

pip install agentkit-mcp   # v0.1.15
agentkit-mcp               # CLI entrypoint

Quick Start

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env  # fill in keys + POSTGRES_URL
python mcp_server.py

Claude Desktop Setup

Add to ~/.config/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "agentkit": {
      "command": "python",
      "args": ["/abs/path/to/agentkit/mcp_server.py"],
      "env": {
        "MCP_TRANSPORT": "stdio",
        "POSTGRES_URL": "postgresql://...",
        "LOG_LEVEL": "DEBUG",
        "TELEMETRY_OPT_OUT": "true"
      }
    }
  }
}

MCP_TRANSPORT=stdio is required here — without it mcp_server.py defaults to serving over SSE (a network port) instead of talking JSON-RPC over the pipes Claude Desktop spawns it with, and no tools will appear. Local stdio mode doesn't need MCP_AUTH_TOKEN (the OS process boundary is the auth boundary); that variable only matters for the SSE/network path.

Multi-Provider LLM Routing

The 3-agent LangGraph workflow (workflow.py) and the demos/research scripts route each role to its own model via LiteLLM, configured with plain provider/model strings — no code changes to switch providers:

  • LLM_REASONING — planner + reporter agents (defaults to anthropic/claude-sonnet-4-6)

  • LLM_DEFAULT — the tool-calling analyst agent (defaults to groq/openai/gpt-oss-120b)

  • LLM_JUDGE — used by the eval suite (defaults to anthropic/claude-haiku-4-5)

  • LLM_LOCAL + INFERENCE_MODE=local — route to a local/self-hosted model (e.g. Ollama) instead of a hosted provider

Set the matching provider API key(s) (GROQ_API_KEY, ANTHROPIC_API_KEY, OPENAI_API_KEY) for whichever models you reference above. See .env.example.

  • Diagnostics: adjust LOG_LEVEL to DEBUG for verbose logs.

  • Telemetry: off by default (TELEMETRY_URL is blank out of the box). Set TELEMETRY_URL to opt in to a single anonymous startup ping (at most once per ~6 hours per instance — a timestamp plus a randomly generated, non-hardware-derived install ID; no prompts, tool calls, or application data), or set TELEMETRY_OPT_OUT=true to disable it outright regardless of TELEMETRY_URL.

Restart Claude Desktop, then ask:

  • "What's our company health right now?"

  • "Forecast revenue for the next 6 months."

  • "Are there anomalies in the Finance KPIs?"

LangGraph Workflow

from agentkit_mcp.workflow import analyze
result = analyze("What drove gross margin in Q1?")
print(result["report"])

Architecture

        Claude Desktop / Cursor / LangGraph
                      │
                      ▼ MCP
              ┌────────────────────────┐
              │     mcp_server.py      │
              │  6 core tools (read)   │
              │  + N pack tools        │
              │    (read/write/        │
              │     destructive)       │
              │ 10 resources, 1 prompt │
              └────────────┬───────────┘
                            │
        ┌───────────────────┼──────────────────┐
        ▼                   ▼                  ▼
   pg_store            insights          forecasting
   (KPIs, real         (health,          (scikit-learn
   domains + write-    anomalies)        LinearRegression
   back annotations)                     + Monte Carlo CI)

Research Contribution

  • Standardized MCP middleware — unified stdio and SSE transport for hot-swappable agent tools.

  • Capability policy engine — formal effect separation (read/write/destructive) and prompt-independent guardrails.

  • Multi-agent interoperability — verified across Claude Desktop, Cursor IDE, and Devin AI.

For the full formalization, literature context, and citation details, see RESEARCH.md.

Benchmark Replication Suite

Run the reproducible benchmark evaluation suites:

# Test MCP framework overhead
python3 eval/run_benchmarks.py --seed 42

# Full 43-scenario LangGraph suite across all 10 KPI domains
python3 eval/run_dspy_eval.py

# Comprehensive MCP tool execution metrics
python3 eval/run_mcp_tools_benchmark.py

Integration Guides (Claude Desktop, Cursor, Devin)

Automated client verification:

python3 tests/test_mcp_client.py

License & Enterprise Use (Dual-License)

This project is open-source under the AGPL-3.0 License. It is completely free for researchers, students, and open-source hobbyists. Commercial license: see COMMERCIAL.md.

Available Tools

9 tools
annotate_metricAnnotate MetricB

Attach a durable operational finding, investigation note, or root-cause explanation to a specific KPI metric and recording period. Requires write permissions enabled.

Effect: WRITE — mutates data. Pass dry_run=true to preview without committing.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteYes
authorNoagentkit
metricYes
periodYes
dry_runNo
severityNoinfo

TDQS

B3.3/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 and does reasonably well: it discloses that this mutates data, states the write-permission prerequisite, and offers a dry_run escape hatch. It omits other behavioral traits an agent would want, such as whether annotations are additive/duplicative, how errors on an unknown metric or period are surfaced, and how severity affects the record.

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?

Two tight, front-loaded blocks — purpose first, then the effect/dry-run contract — with no filler sentences. 'Durable' is doing light work but the rest earns its place.

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

Completeness2/5

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

For a six-parameter mutation tool with 0% schema coverage and no annotations or output schema, the definition covers write semantics and previewing but leaves the core parameter vocabulary (metric identifier, period format, severity scale) undefined, so an agent could still call it incorrectly.

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

Parameters2/5

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

Schema description coverage is 0% across six parameters, so the description must compensate and largely does not. Only dry_run is explained; the formats of metric, period, note, author, and the allowed severity values remain unspecified in both schema and prose.

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 (attach) and resource (a durable finding/note/root-cause explanation) scoped to a KPI metric and recording period, which is concrete enough to separate it from read-oriented siblings like query_kpis or list_annotations. It stops short of explicitly naming the inverse sibling retract_annotation, so sibling disambiguation is only implied by the word 'durable'.

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?

Provides real operational context: write permissions must be enabled, and dry_run=true previews without committing. However it never states when this tool is the right choice versus list_annotations/retract_annotation, nor when not to use it, leaving usage largely inferred.

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

detect_kpi_anomaliesDetect Kpi AnomaliesA

Detect statistical anomalies, sudden spikes, and unexpected deviations in KPI time-series history.

Analyzes metric historical distributions within a specified business domain using rigorous parametric (Z-Score) or non-parametric (IQR - Interquartile Range) anomaly detection algorithms to identify operational risks, unexpected budget variances, or sudden performance degradation.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesTarget business domain to evaluate (e.g. 'Finance', 'Operations', 'Customer', 'People', 'Engineering', 'Growth', 'ESG', 'IT'). Required.
methodNoStatistical anomaly detection algorithm to execute. Options: - 'zscore': Standard deviation testing for normally distributed metrics (default). - 'iqr': Robust quartile range testing for skewed or fat-tailed metric distributions.zscore
thresholdNoSensitivity cutoff factor for classification. For 'zscore', specifies standard deviations from mean (default: 2.5). For 'iqr', specifies multiplier above Q3/below Q1 (default: 1.5).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the analytical methods (parametric Z-Score vs non-parametric IQR) and their rationale, which is useful behavioral context, but does not state that this is a read-only analysis, nor mention data-freshness or volume constraints. Adequate but incomplete for an annotation-free tool.

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?

Two sentences, front-loaded with the core action and followed by method context. Slightly diluted by qualifiers ('rigorous', 'operational risks, unexpected budget variances, or sudden performance degradation'), but overall 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?

An output schema exists, so return values need not be explained. For a three-parameter, single-required analysis tool the description covers purpose, methods, and domain scope adequately; only usage routing against siblings is missing.

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 all three parameters (domain, method, threshold) are already fully documented in the schema, including defaults and algorithm semantics. The description adds no parameter detail beyond what the schema provides, 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?

Clear verb (detect) plus resource (KPI anomalies/time-series deviations), scoped to a business domain. An agent can readily distinguish this from siblings like forecast_metric or query_kpis, which do not perform anomaly classification.

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 the stated goal ('identify operational risks, unexpected budget variances'), but there is no explicit when-to-use guidance or contrast with alternatives such as forecast_metric or get_company_health. The agent must infer the trigger conditions.

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

forecast_metricForecast MetricA

Generate forward-looking time-series forecasts with Monte Carlo confidence intervals for a named KPI.

Applies trend analysis and linear projection mathematical modeling over historical monthly metric data to predict future trajectory across specified forward horizon periods, providing upper and lower bound confidence intervals.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodsNoNumber of monthly periods ahead to project. Defaults to 6 periods (range: 1 to 24).
metric_nameYesExact or substring name of the KPI metric to forecast (e.g. 'revenue', 'mrr', 'gross_margin', 'headcount', 'cac', 'active_users', 'churn_rate').
confidence_levelNoStatistical confidence interval band width (e.g. 0.95 for 95% confidence interval). Defaults to 0.95.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/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 and does disclose meaningful behavior: the modeling approach (trend analysis and linear projection), the probabilistic method (Monte Carlo), and the result shape (upper/lower confidence bounds). It does not state that this is a read-only computation or note any cost/rate/permission constraints, which is the remaining gap.

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

Conciseness3/5

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

The first sentence is strong and front-loaded, but the second is bloated with redundant phrasing ('forward-looking' vs 'predict future trajectory', 'trend analysis and linear projection mathematical modeling'). It could convey the same method detail in roughly half the words.

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

Completeness4/5

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

An output schema exists, so return values need not be re-explained, and the description covers purpose, method, and output concept for a 3-parameter tool. What is missing is the when-to-use routing and any operational caveats, but overall it is nearly complete for invocation.

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 periods, confidence_level, and metric_name are already fully documented in the schema. The description merely restates horizon and confidence-interval concepts without adding format or default guidance beyond the schema; 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 and resource ('Generate forward-looking time-series forecasts ... for a named KPI') and names the concrete output (Monte Carlo confidence intervals). It is clearly distinguishable from siblings like query_kpis (retrieval) and detect_kpi_anomalies (anomaly detection).

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 'forward-looking' and 'predict future trajectory' versus the historical orientation of siblings, but the description never states when to choose this over query_kpis or get_executive_summary, nor any prerequisites. Implied context only, no exclusions.

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

get_company_healthGet Company HealthB

Compute composite organizational health scores and diagnostic health index breakdown.

Synthesizes multi-factor business performance indicators into a holistic 0-100 health score with categorized qualitative interpretations ('Optimal', 'Healthy', 'Warning', 'Critical') and sub-component scores across growth rate, profit margins, cash runway, and operational efficiency.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoOptional business domain to compute isolated departmental health for (e.g. 'Finance', 'Operations', 'Customer', 'Growth'). If omitted or None, calculates company-wide aggregate health.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the output's shape (composite score, categorical labels, sub-component breakdown) but says nothing about permissions, cost, idempotency, or what happens when underlying data is sparse, leaving real behavioral gaps for an un-annotated tool.

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

Conciseness4/5

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

The purpose is front-loaded in the first line with supporting detail after. It is slightly padded with qualifiers ('holistic', 'multi-factor'), but nothing is redundant or confusing.

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?

An output schema exists, so return values need not be re-explained, yet the description helpfully characterizes the score bands and sub-components. For a single-optional-parameter read/analysis tool this is nearly sufficient; only the lack of usage routing keeps it from being 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?

Only one optional parameter with 100% schema description coverage, so the schema already explains the domain filter and its default-to-aggregate behavior. The description adds no syntax, valid-value, or casing 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.

Purpose4/5

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

States a specific verb+resource: computes a composite organizational health score with a defined 0-100 scale and qualitative bands. It is distinguishable from siblings like query_kpis or get_executive_summary in tone, but never explicitly contrasts itself with them, so it stops short of a 5.

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 when-to-use guidance and no alternatives named, despite siblings (query_kpis, get_executive_summary, detect_kpi_anomalies) that plausibly overlap. The only conditional context is for the domain parameter, which is parameter-level, not tool-selection guidance.

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

get_executive_summaryGet Executive SummaryA

Generate a comprehensive one-shot executive briefing synthesizing health, key metrics, and anomalies.

Executes a high-level cross-domain synthesis combining composite organizational health diagnostics, primary KPI indicators, and active statistical anomalies across Finance, Operations, and Growth into an actionable briefing for leadership.

Returns: A dictionary containing: - 'summary': High-level descriptive briefing title. - 'health_score': Overall company health index (0.0 to 100.0). - 'interpretation': Overall company health classification string ('Optimal', 'Healthy', 'Warning', 'Critical'). - 'components': Breakdown of health scores (growth, margin, cash_score, efficiency). - 'key_metrics': Top 5 representative business KPI metric records. - 'anomalies': Top 5 active statistical anomalies requiring immediate executive review.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose meaningful behavior: the synthesis spans Finance, Operations, and Growth, results are capped at the top 5 metrics and top 5 anomalies, and the health index is bounded 0.0-100.0 with named classification bands. It stops short of saying the operation is read-only or commenting on latency/cost for a full cross-domain computation.

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

Conciseness3/5

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

The opening sentence is well front-loaded and the paragraph on cross-domain scope earns its place. The entire 'Returns' block, however, restates the output schema field-by-field and is largely redundant given that an output schema exists, bloating the definition without adding selection value.

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 zero-parameter tool with a rich output schema and no annotations, the description supplies what an agent needs: what it produces, its scope, and its role as the aggregate briefing. The main omission is any statement of side-effect profile or execution cost, which matters because this fans out across three domains.

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 there is nothing for the description to disambiguate; the baseline for a parameterless tool applies. No parameter semantics are claimed or missing.

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 ('Generate ... executive briefing') and explicitly defines it as a cross-domain synthesis combining health diagnostics, KPI indicators, and anomalies. That framing distinguishes it from the narrower siblings get_company_health, query_kpis, and detect_kpi_anomalies without needing to name them.

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 phrases 'one-shot' and 'for leadership' imply this is the aggregate call to prefer over the individual sibling tools, and 'synthesizing health, key metrics, and anomalies' hints at the three tools it replaces. However, it never states when to use it versus those siblings or when a focused call would be better, leaving the routing to inference.

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

list_annotationsList AnnotationsA

Read historical metric annotations and operator notes, ordered from most recent to oldest. Allows filtering by a specific KPI metric and optionally including retracted entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
metricNo
include_retractedNo

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations present, the description carries the full behavioral burden. It usefully discloses default ordering (most recent first) and the existence of retracted entries that can be excluded, but says nothing about permissions/auth, pagination behavior, or the shape of returned records.

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 core capability and ordering are front-loaded, and the filtering capability follows. Nothing is repetitive or redundant.

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

Completeness3/5

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

There is no output schema and no annotations, so the description is the only source of behavioral context. It covers ordering and filtering but omits the return shape, pagination/limit semantics, and auth requirements, leaving it only minimally adequate for a listing tool.

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, and it partially does: it explains that results can be filtered by metric and that retracted entries are optionally included. However, the 'limit' parameter and the defaults (limit=50, include_retracted=false) are never mentioned, leaving one of three parameters unexplained.

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 ('Read historical metric annotations and operator notes') plus an ordering guarantee (most recent to oldest), which is more than the name alone conveys. It implicitly contrasts with the write-oriented siblings annotate_metric and retract_annotation, but never names them, so sibling differentiation is left to inference.

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 implies when the tool is useful, i.e. pulling historical annotations filtered by a specific KPI, but gives no explicit when-to-use, when-not-to-use, or pointer to alternatives such as query_kpis or get_executive_summary. Usage must be inferred from the capability statement.

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

list_available_metricsList Available MetricsA

Discover all supported KPI metrics, business domains, and available historical time periods.

Essential discovery tool for agents to inspect the metadata schema before formulating specific queries, anomaly detections, or predictive forecasts.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoOptional business category to filter metric names by (e.g. 'Finance', 'People', 'Operations', 'Customer', 'Engineering'). If omitted, returns all global metrics.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/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. 'Discover'/'list' strongly imply a read-only, non-mutating operation, but this is never stated outright, nor are permissions, pagination, or scope limits described. For a simple read tool this is adequate but leaves the safety profile to inference.

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?

Two tight sentences, front-loaded with the core purpose followed by the usage cue. No filler, though the second sentence's 'Essential discovery tool for agents to...' is mildly redundant with the first.

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?

An output schema exists, so return values needn't be explained, and the description already summarizes what is listed (metrics, domains, time periods). For a one-optional-parameter discovery tool this is nearly complete; only the read-only/auth posture is 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?

Schema description coverage is 100%, so the sole 'domain' parameter (with examples and default behavior) is fully documented in the schema. The description adds no additional parameter meaning, which is the expected baseline 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?

States a clear verb ('discover', 'list') and resource ('KPI metrics, business domains, historical time periods'), so the agent knows exactly what is returned. It distinguishes itself implicitly from query_kpis/detect_kpi_anomalies/forecast_metric by positioning itself as the metadata-inspection step, though it doesn't name those siblings explicitly.

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: use it 'before formulating specific queries, anomaly detections, or predictive forecasts' — i.e., as a prerequisite discovery step. This routes the agent effectively, but it does not explicitly state when NOT to use it or name the alternatives by name.

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

query_kpisQuery KpisB

Retrieve historical and real-time Key Performance Indicators (KPIs) from the governed Postgres store.

Fetches structured time-series metrics across enterprise business domains including Finance, People (HR), Operations, Customer (Sales/Support), Engineering, Growth, Logistics, ESG, IT, and Security.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of metric records to return. Defaults to 100 (range: 1 to 500).
domainNoOptional taxonomy category filter (e.g. 'Finance', 'People', 'Operations', 'Customer', 'Engineering', 'Growth', 'ESG', 'IT', 'Security'). Omit to query across all domains.
period_toNoOptional end period in 'YYYY-MM' format (e.g. '2026-06'). Inclusive upper bound.
period_fromNoOptional start period in 'YYYY-MM' format (e.g. '2024-01'). Inclusive lower bound.
metric_filterNoOptional substring or exact metric name match (e.g. 'revenue', 'churn_rate', 'gross_margin', 'cac', 'headcount'). Case-insensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses the data source ('governed Postgres store') and that data is both historical and real-time, and the verbs 'Retrieve'/'Fetches' imply a read-only operation. But it omits permissions, pagination/truncation behavior, and any access-control implications of the 'governed' store.

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?

Two sentences, front-loaded with the core action and scope. The long domain enumeration in sentence two partially duplicates the domain parameter description in the schema, which is mild redundancy but not bloat.

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

Completeness3/5

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

An output schema exists and the input schema is fully described, so return values need not be explained. Still, for a multi-domain query tool the description leaves sibling differentiation and the read-safety profile implicit, which are meaningful 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 description coverage is 100%, so all five parameters are already fully documented in the schema. The description's domain enumeration loosely maps to the 'domain' filter but adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

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 ('Retrieve'/'Fetches') and resource (KPIs / structured time-series metrics) with clear scope ('historical and real-time', 'governed Postgres store'). However, it never distinguishes itself from siblings like list_available_metrics, get_executive_summary, detect_kpi_anomalies, or forecast_metric, which an agent must infer from name alone.

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?

No when-to-use or when-not-to-use guidance is provided. The description doesn't explain the relationship to detection, forecasting, or summary siblings, so an agent has no signal for choosing this tool over list_available_metrics or get_executive_summary.

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

retract_annotationRetract AnnotationA

Soft-delete an erroneous or outdated annotation (stamps retracted_at). Classed as a destructive action requiring a valid operator approval token.

Effect: DESTRUCTIVE — mutates data. Pass dry_run=true to preview without committing. Requires a human-supplied approval_token.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNo
annotation_idYes
approval_tokenNo

TDQS

A4.2/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 and does well: it discloses that this is destructive, that it is a soft delete (retracted_at, implying recoverability), that dry_run=true previews without committing, and that a human-supplied approval_token is required. It omits return behavior and any reversibility/undo details, which keeps it from a 5.

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

Conciseness3/5

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

The core facts are front-loaded, but the destructive/approval-token information is stated twice (once in the opening paragraph, again in the 'Effect' line), which is dead weight rather than reinforcement.

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 3-param mutation tool with no annotations and no output schema, the description covers the essentials an agent needs before calling: destructive semantics, a safe preview path, and an auth prerequisite. It could still say whether retraction is undoable and what the call returns.

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 0%, so the description must compensate; it explains the two non-obvious parameters (dry_run as a preview switch, approval_token as human-supplied) well beyond the bare schema. annotation_id is left unexplained, but it is self-evident from the tool's purpose.

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 ('Soft-delete an ... annotation') and clarifies the mechanism by naming the concrete effect ('stamps retracted_at'). An agent can distinguish this from annotate_metric or list_annotations without opening a 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?

The qualifier 'erroneous or outdated' gives a clear condition for when this tool applies, which is real usage guidance. It does not, however, name alternatives (e.g., annotate_metric for corrections) or state when not to retract, so it stops 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.

Tool Schema Changelog

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

  1. 5 tool updatesv0.1.16
    • Changeddetect_kpi_anomalies3 fields changed
      • addedInput schema / properties / domain / description
        Added value: +"Target business domain to evaluate (e.g. 'Finance', 'Operations', 'Customer',\n'People', 'Engineering', 'Growth', 'ESG', 'IT'). Required."
      • addedInput schema / properties / method / description
        Added value: +"Statistical anomaly detection algorithm to execute. Options:\n- 'zscore': Standard deviation testing for normally distributed metrics (default).\n- 'iqr': Robust quartile range testing for skewed or fat-tailed metric distributions."
      • addedInput schema / properties / threshold / description
        Added value: +"Sensitivity cutoff factor for classification. For 'zscore', specifies standard\ndeviations from mean (default: 2.5). For 'iqr', specifies multiplier above Q3/below Q1 (default: 1.5)."
    • Changedforecast_metric3 fields changed
      • addedInput schema / properties / confidence_level / description
        Added value: +"Statistical confidence interval band width (e.g. 0.95 for 95% confidence interval).\nDefaults to 0.95."
      • addedInput schema / properties / metric_name / description
        Added value: +"Exact or substring name of the KPI metric to forecast (e.g. 'revenue', 'mrr',\n'gross_margin', 'headcount', 'cac', 'active_users', 'churn_rate')."
      • addedInput schema / properties / periods / description
        Added value: +"Number of monthly periods ahead to project. Defaults to 6 periods (range: 1 to 24)."
    • Changedget_company_health1 field changed
      • addedInput schema / properties / domain / description
        Added value: +"Optional business domain to compute isolated departmental health for (e.g. 'Finance',\n'Operations', 'Customer', 'Growth'). If omitted or None, calculates company-wide aggregate health."
    • Changedlist_available_metrics1 field changed
      • addedInput schema / properties / domain / description
        Added value: +"Optional business category to filter metric names by (e.g. 'Finance', 'People',\n'Operations', 'Customer', 'Engineering'). If omitted, returns all global metrics."
    • Changedquery_kpis5 fields changed
      • addedInput schema / properties / domain / description
        Added value: +"Optional taxonomy category filter (e.g. 'Finance', 'People', 'Operations',\n'Customer', 'Engineering', 'Growth', 'ESG', 'IT', 'Security'). Omit to query across all domains."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of metric records to return. Defaults to 100 (range: 1 to 500)."
      • addedInput schema / properties / metric_filter / description
        Added value: +"Optional substring or exact metric name match (e.g. 'revenue', 'churn_rate',\n'gross_margin', 'cac', 'headcount'). Case-insensitive."
      • addedInput schema / properties / period_from / description
        Added value: +"Optional start period in 'YYYY-MM' format (e.g. '2024-01'). Inclusive lower bound."
      • addedInput schema / properties / period_to / description
        Added value: +"Optional end period in 'YYYY-MM' format (e.g. '2026-06'). Inclusive upper bound."
  2. 9 tool updatesv0.1.0
    • First observedannotate_metric
    • First observeddetect_kpi_anomalies
    • First observedforecast_metric
    • First observedget_company_health
    • First observedget_executive_summary
    • First observedlist_annotations
    • First observedlist_available_metrics
    • First observedquery_kpis
    • First observedretract_annotation

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: retraction vs. annotation vs. querying KPIs vs. health scoring vs. anomaly detection vs. forecasting vs. listing metrics vs. executive summary. No two tools overlap in function.

Naming Consistency4/5

Consistent verb_noun convention (retract_annotation, query_kpis, get_company_health, detect_kpi_anomalies, forecast_metric, list_available_metrics, get_executive_summary, list_annotations, annotate_metric). The verb 'get' vs 'list' vs 'annotate' vs 'retract' is used appropriately based on action type, though 'get_executive_summary' could arguably be 'generate' but it's a read operation.

Tool Count5/5

9 tools is well within the ideal 3-15 range. The set covers discovery, analysis, forecasting, annotation management, and executive summary without redundancy or bloat.

Completeness4/5

The tool surface covers the full lifecycle for KPI analysis (discovery, query, anomaly detection, forecasting, health scoring, annotations with retraction). However, there is no direct tool for creating or updating KPI metrics themselves (e.g., defining new metrics or modifying existing ones), which may be needed for a governed store. Also, no tool for listing all domains or periods beyond the discovery tool, but that is covered by list_available_metrics.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers