Skip to main content
Glama

OraClaw

MIT License MCP Algorithms Latency npm API Status

MCP Optimization Tools for AI Agents -- 17 tools (11 free, no key), sub-25ms. Zero LLM cost.

Your AI agent can't do math. OraClaw gives it deterministic optimization, simulation, forecasting, and risk analysis through the Model Context Protocol. Every tool returns structured JSON, runs in under 25ms, and costs nothing to compute.


🚀 Using OraClaw in production — or want managed hosting, premium tools, or priority support? Tell me about your use case → — I read every one.

💬 Building something with it? Star the repo and say hi in Discussions — what you build steers what I ship next.


What this solves

LLMs generate plausible text, not mathematically optimal answers. OraClaw gives an AI agent a set of deterministic numerical tools it can call instead of guessing — each returns structured JSON from a real algorithm, with no token spend on reasoning. Concretely:

  • Your agent needs to pick the next variant to try (A/B test arm, ad/email copy, recommendation) and balance exploration against exploitation — without hand-rolling a bandit or letting the model eyeball it. Call optimize_bandit (or optimize_contextual when the best choice depends on per-call features).

  • Your agent needs a provably optimal allocation or schedule under hard constraints (budget split, integer counts, capacity caps) — without the model hallucinating constraints. Call solve_constraints (LP/MIP/QP via HiGHS) or solve_schedule for task-to-slot fitting.

  • Your agent needs to quantify uncertainty around an outcome — project a value under an uncertain input, or measure VaR/CVaR on a weighted multi-asset book with auditable assumptions — without a Monte Carlo loop in the prompt. Call simulate_montecarlo, simulate_scenario, or analyze_risk.

  • Your agent needs a point forecast or an outlier flag on a time series (demand, KPIs, sensor/metric streams) — without inventing trend math. Call predict_forecast (ARIMA / Holt-Winters) or detect_anomaly (Z-score / IQR).

  • Your agent needs to fuse or score probability signals — combine model outputs, measure how much independent sources agree, or check whether past predictions were well-calibrated. Call predict_ensemble, score_convergence, or score_calibration.

  • Your agent needs to reason over a graph — rank influential nodes, cluster a dependency/knowledge graph, find a critical path, or route between two nodes. Call analyze_graph or plan_pathfind.


Related MCP server: Math-Physics-ML MCP System

Where the algorithms have been used

OraClaw's algorithms have informed implementations in several open-source projects -- through contributed routing specs, algorithm guidance, and shared math -- spanning AI agent orchestration, time-series tracking, vector search, and optimization.

Selected contributions (see CHANGELOG.md for the full list):

  • chernistry/bernstein -- agent orchestration framework. LinUCB contextual router (α=0.3) with shadow-evaluation path and interpretable decision reasons, shipped in codex/issue-367-linucb-router after a contributed spec correction.

  • stxkxs/nanohype -- contextual bandit routing, pluggable strategy registry (hash / sliding-TTL / semantic), cost anomaly detection. "Your input shaped a lot of what actually shipped."

  • rfivesix/hypertrack -- Bayesian/Kalman-style adaptive estimator with phase-aware ramp. Shipped in 0.8.0-beta.

  • AlanHuang99/pyrollmatch -- entropy balancing (Hainmueller 2012) with moment constraints + max_weight cap. Shipped in v0.1.3.

  • stffns/vstash -- IDF-sigmoid relevance weighting. Shipped in v0.17.0.

Marketplace distribution:


Quick Start

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "oraclaw": {
      "command": "npx",
      "args": ["-y", "@oraclaw/mcp-server"]
    }
  }
}

Then ask your agent:

"I have 3 email subject line variants. Which should I send next?"

The agent calls optimize_bandit and gets a statistically optimal selection in 0.01ms.

2. REST API (no install)

curl -X POST https://oraclaw-api.onrender.com/api/v1/optimize/bandit \
  -H 'Content-Type: application/json' \
  -d '{
    "arms": [
      {"id": "A", "name": "Option A", "pulls": 10, "totalReward": 7},
      {"id": "B", "name": "Option B", "pulls": 10, "totalReward": 5},
      {"id": "C", "name": "Option C", "pulls": 2, "totalReward": 1.8}
    ],
    "algorithm": "ucb1"
  }'

Response (<1ms):

{
  "selected": { "id": "C", "name": "Option C" },
  "score": 1.876,
  "algorithm": "ucb1",
  "exploitation": 0.9,
  "exploration": 0.976,
  "regret": 0.1
}

Free tier: 25 calls/day, no API key needed.

3. npm SDK

npm install @oraclaw/bandit
import { OraBandit } from '@oraclaw/bandit';

const client = new OraBandit({ baseUrl: 'https://oraclaw-api.onrender.com' });
const result = await client.optimize({
  arms: [
    { id: 'A', name: 'Short Subject', pulls: 500, totalReward: 175 },
    { id: 'B', name: 'Long Subject', pulls: 300, totalReward: 126 },
  ],
  algorithm: 'ucb1',
});

14 SDK packages: @oraclaw/bandit, @oraclaw/solver, @oraclaw/simulate, @oraclaw/risk, @oraclaw/forecast, @oraclaw/anomaly, @oraclaw/graph, @oraclaw/bayesian, @oraclaw/ensemble, @oraclaw/calibrate, @oraclaw/evolve, @oraclaw/pathfind, @oraclaw/cmaes, @oraclaw/decide


Why?

LLMs generate plausible text, not optimal solutions. Ask GPT to pick the best A/B test variant and it applies a heuristic that ignores the exploration-exploitation tradeoff. Ask it to solve a linear program and it hallucinates constraints. OraClaw gives your agent access to real algorithms -- bandits, solvers, forecasters, risk models -- that return mathematically correct answers in sub-millisecond time, without burning tokens on reasoning.


MCP Tool Catalog (17 tools)

Free tier (11 tools, no API key — 25 calls/day per IP):

Tool

What It Does

Latency

optimize_bandit

UCB1 / Thompson / Epsilon-Greedy arm selection

0.01ms

optimize_contextual

Context-aware LinUCB bandit

0.05ms

optimize_evolve

Genetic algorithm for discrete + multi-objective problems

<10ms

solve_schedule

Energy-matched task scheduling

3ms

score_convergence

Multi-source probability consensus (Hellinger)

0.04ms

score_calibration

Brier + log score for forecaster accuracy

0.02ms

predict_bayesian

Beta posterior update from weighted evidence

0.05ms

predict_ensemble

Multi-model consensus + uncertainty decomposition

0.1ms

plan_pathfind

A* + Yen's k-shortest paths

0.1ms

simulate_montecarlo

Single-factor Monte Carlo (6 distributions)

<2ms

simulate_scenario

What-if comparison + sensitivity ranking

<5ms

Premium tier (6 tools, requires ORACLAW_API_KEY):

Tool

What It Does

Latency

optimize_cmaes

CMA-ES continuous black-box optimization

12ms

solve_constraints

LP / MIP / QP solver via HiGHS (provably optimal)

2ms

analyze_graph

PageRank, Louvain communities, bottleneck detection

0.5ms

analyze_risk

VaR and CVaR (Expected Shortfall)

<2ms

predict_forecast

ARIMA + Holt-Winters time series forecasting

0.08ms

detect_anomaly

Z-Score + IQR anomaly detection

0.01ms

14 of 18 REST endpoints respond in under 1ms. All under 25ms.


Try It Now

The API is live. No signup required.

# Bayesian inference
curl -X POST https://oraclaw-api.onrender.com/api/v1/predict/bayesian \
  -H 'Content-Type: application/json' \
  -d '{"prior": 0.3, "evidence": [{"factor": "positive_test", "weight": 0.9, "value": 0.05}]}'

# Monte Carlo simulation
curl -X POST https://oraclaw-api.onrender.com/api/v1/simulate/montecarlo \
  -H 'Content-Type: application/json' \
  -d '{"simulations": 1000, "distribution": "normal", "params": {"mean": 100, "stddev": 15}}'

# Monte Carlo with a non-normal distribution
curl -X POST https://oraclaw-api.onrender.com/api/v1/simulate/montecarlo \
  -H 'Content-Type: application/json' \
  -d '{"simulations": 1000, "distribution": "triangular", "params": {"min": 80, "mode": 100, "max": 140}}'

Premium tools (detect_anomaly, predict_forecast, analyze_risk, solve_constraints, analyze_graph, optimize_cmaes) need an API key or an x402 payment — see Pricing below.


Pricing

Tier

Calls

Price

Auth

Free

25/day

$0

None

Pay-per-call

1K/day

$0.005/call

API key

Starter

50K/mo

$9/mo

API key

Growth

500K/mo

$49/mo

API key

Scale

5M/mo

$199/mo

API key

x402 (for autonomous agents): pay $0.001/call in USDC on Base — no signup, no API key. Send a signed PAYMENT-SIGNATURE header on any premium endpoint; the API verifies, meters, and settles per call. Get a key instead with a one-line POST /api/v1/auth/signup ({"email":"you@…"}) — instant, no card.


Source Code


Building with OraClaw?

We'd love to hear what you're working on. Share your use case, ask questions, or request features:



If this saved your agent from hallucinating math, star us :star:

License

MIT

Available Tools

17 tools
analyze_graphA
Read-onlyIdempotent

[Premium] Compute structural properties of a directed graph: PageRank centrality, Louvain community detection, shortest critical path between two nodes, and bottleneck identification. Use to surface influential nodes, community clusters, or chokepoints in dependency graphs, knowledge graphs, supply chains, social networks. For pathfinding alone (single source→goal route), use plan_pathfind — it's faster and free. Requires ORACLAW_API_KEY.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodesYes
edgesYes
sourceGoalNoOptional: node ID to use as start of critical path.
targetGoalNoOptional: node ID to use as end of critical path.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageRankYesNode ID → PageRank score.
communitiesYesNode ID → community index.
clustersNo
criticalPathNoNode IDs from sourceGoal to targetGoal.
criticalPathWeightNo
bottlenecksNoNodes whose removal most disconnects the graph.
totalNodesYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and idempotentHint=true, covering safety and repeatability. The description adds behavioral context: it's premium (implying cost), requires an API key, and computes multiple analytics in one call. No contradictions. A high score as the description adds value beyond annotations.

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

Conciseness5/5

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

The description is four sentences long, front-loaded with the core purpose and key differentiator. Every sentence adds value: purpose, use cases, alternative, prerequisite. No redundant or vague language. 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 complexity (multiple analytics, premium, sibling tools), the description covers purpose, usage, alternative, and prerequisite. Output schema exists so return values are covered. It doesn't discuss limitations or error handling, but the core information is present. A minor gap in mentioning required parameters explicitly is offset by schema.

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 50% (only sourceGoal and targetGoal have descriptions). The description does not elaborate on nodes or edges beyond mentioning 'directed graph'. It adds no meaning to the node properties (id, type, label, confidence) or edge properties (source, target, type, weight). The description fails to compensate for the low coverage.

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

Purpose5/5

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

The description clearly states the tool computes multiple structural properties (PageRank, Louvain, critical path, bottlenecks) and distinguishes it from the sibling tool plan_pathfind by noting the latter is for simple pathfinding only. The verb 'Compute' and specific metrics make the purpose very clear.

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

Usage Guidelines5/5

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

The description explicitly says when to use the tool (for influential nodes, communities, chokepoints) and when not to (for pathfinding alone, use plan_pathfind, which is faster and free). It also mentions the prerequisite ORACLAW_API_KEY. This provides strong usage guidance.

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

analyze_riskA
Read-onlyIdempotent

[Premium] Compute portfolio Value-at-Risk (VaR) and Conditional VaR (Expected Shortfall) from historical asset return series, accounting for cross-asset correlation. Use for portfolio risk attribution, regulatory capital sizing, drawdown scenario analysis. Returns are matrix [asset][time] of period returns. For simulating outcomes from a parametric distribution rather than historical data, use simulate_montecarlo. Requires ORACLAW_API_KEY.

ParametersJSON Schema
NameRequiredDescriptionDefault
returnsYes[asset][time] matrix of period returns (e.g. daily). Each row same length.
weightsYesPortfolio weights per asset. Length must equal returns.length. Should sum to 1.
confidenceNoVaR confidence level (default: 0.95).
horizonDaysNoHorizon in days, scales VaR by sqrt(horizon) (default: 1).

Output Schema

ParametersJSON Schema
NameRequiredDescription
varYesValue-at-Risk at the requested confidence (loss expressed as positive number).
cvarYesConditional VaR (mean loss beyond VaR threshold).
expectedReturnYes
volatilityYes
confidenceNo
horizonDaysNo
assetsNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate read-only, non-destructive, idempotent, open-world. The description adds context: premium feature, requires API key, and explains that it uses historical data and computes VaR/CVaR. No contradictions.

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?

Description is concise: a few sentences front-loaded with purpose, followed by use case, alternative, and requirement. No wasted words.

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?

Given the output schema exists, the description provides sufficient context: input format, use cases, alternative tool, and access requirements. Covers the complexity well.

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 descriptions exist for all parameters. The overall description clarifies the 'returns' parameter format as matrix and explains horizon scaling. Adds value beyond 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 clearly states the tool computes VaR and CVaR from historical returns, accounting for cross-asset correlation. It lists specific use cases and distinguishes from the sibling tool simulate_montecarlo.

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 tells when to use (risk attribution, regulatory capital, drawdown analysis) and when not to use (parametric simulations) by naming the alternative. Also notes premium status and API key requirement.

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

detect_anomalyA
Read-onlyIdempotent

[Premium] Flag outlier points in a numeric series using Z-score (parametric, assumes ~normal) or IQR (robust to skew). Use for monitoring metrics, fraud signals, sensor noise, quality control. Z-score is faster and tighter on near-normal data; IQR is the right default when the distribution has heavy tails or known outliers. Returns indices + values + the underlying statistics. For projecting a series forward, use predict_forecast. Requires ORACLAW_API_KEY.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesNumeric series to scan.
methodNoDefault: zscore.
thresholdNoZ-score: standard deviations above mean (default: 3.0). IQR: multiplier on IQR (default: 1.5).

Output Schema

ParametersJSON Schema
NameRequiredDescription
methodYes
anomaliesYes
statsNoFor zscore: {mean, stdDev, threshold}. For iqr: {q1, q3, iqr, lowerBound, upperBound}.
totalPointsNo
anomalyCountYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate read-only and idempotent. Description adds premium requirement (ORACLAW_API_KEY) and return details (indices, values, statistics), improving transparency beyond annotations.

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

Conciseness5/5

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

Five sentences efficiently convey purpose, usage, parameters, and limitations, with no redundancy.

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

Completeness5/5

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

With full schema coverage, annotations, and output schema, description adds algorithm rationale, return structure, and a sibling reference, making it complete.

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

Parameters4/5

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

Schema covers all parameters with descriptions. Description adds contextual defaults (thresholds) and method selection criteria (Z-score vs IQR), enhancing semantic understanding.

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?

Description clearly states it detects outliers in numeric series using Z-score or IQR, specifying use cases like monitoring metrics, fraud signals, etc. It distinguishes from sibling tool predict_forecast.

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 explains when to use Z-score (near-normal data) vs IQR (heavy tails), and directs to predict_forecast for projection, providing clear decision guidance.

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

optimize_banditA
Read-only

Pick the best option from a set of variants (Multi-Armed Bandit: UCB1, Thompson sampling, or ε-greedy). Use this when you have N options with observed reward history and need to choose the next one with optimal explore/exploit tradeoff (A/B test arm selection, ad/email variant routing, recommendation ranking). For context-dependent selection (different best option per user/situation), use optimize_contextual instead. For continuous parameter tuning, use optimize_cmaes. Returns the selected arm + score breakdown in <1ms.

ParametersJSON Schema
NameRequiredDescriptionDefault
armsYesCandidate options to choose between (at least 2).
algorithmNoSelection algorithm (default: ucb1). UCB1 is deterministic; thompson/epsilon-greedy sample.

Output Schema

ParametersJSON Schema
NameRequiredDescription
selectedYesThe chosen arm.
scoreYesCombined exploitation + exploration score.
algorithmYesWhich algorithm produced the selection.
exploitationNoPure mean-reward component.
explorationNoUncertainty bonus added to exploitation.
regretNoCumulative regret estimate (lower is better).

TDQS

A4.8/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true (safe read). Description adds return info (arm + score breakdown) and performance guarantee (<1ms). No contradictions. Adds value beyond annotations.

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

Conciseness5/5

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

Two sentences, front-loaded with core purpose, then usage guidance, then return/performance. Every sentence adds value, no fluff.

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?

Comprehensive for a bandit selection tool: purpose, use cases, alternatives, parameter semantics, output description, performance. No gaps given existing schema and annotations.

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?

Adds meaning beyond 100% schema coverage: clarifies that arms need reward history (pulls, totalReward) and explains algorithmic behavior (UCB1 deterministic, thompson/epsilon-greedy sample).

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?

Clearly states 'Pick the best option from a set of variants' and specifies algorithms (UCB1, Thompson, ε-greedy). Distinguishes from siblings optimize_contextual and optimize_cmaes.

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 tells when to use (options with reward history, explore/exploit tradeoff) and when not to use (context-dependent → optimize_contextual, continuous tuning → optimize_cmaes).

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

optimize_cmaesA
Read-only

[Premium] Continuous black-box optimization via CMA-ES (Covariance Matrix Adaptation Evolution Strategy). Use for tuning N continuous parameters when the objective is non-convex, noisy, or has no gradient — hyperparameter search, simulator calibration, control policy tuning. 10-100x fewer evaluations than grid search. For discrete combinatorial problems, use optimize_evolve. For LP/MIP problems with linear constraints, use solve_constraints. Stochastic init means re-runs with the same input may differ slightly. Requires ORACLAW_API_KEY.

ParametersJSON Schema
NameRequiredDescriptionDefault
dimensionYesNumber of parameters to optimize.
objectiveWeightsYesPer-dimension weight in the linear default objective. Length must equal dimension.
initialSigmaNoInitial step size (default: 0.5).
maxIterationsNoMax generations (default: 1000, capped at 5000).
initialMeanNoOptional starting point in parameter space.

Output Schema

ParametersJSON Schema
NameRequiredDescription
bestSolutionYesBest parameter vector found.
bestFitnessYesObjective value at bestSolution (caller's sign convention).
iterationsYesGenerations actually run.
evaluationsNoTotal objective evaluations.
convergedYesWhether convergence criteria were met before maxIterations.
executionTimeMsNo

TDQS

A4.5/5.0
Behavior4/5

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

Discloses stochastic initialization leading to slight differences between runs, and the requirement for ORACLAW_API_KEY. Annotations already indicate non-destructive and read-only nature (readOnlyHint=true, destructiveHint=false), so description adds useful behavioral context without contradiction.

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?

Description is brief and front-loaded with key information (premium, continuous optimization, CMA-ES). Every sentence adds value, with no redundancy.

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

Completeness5/5

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

Provides use cases, limitations, comparison to alternatives, stochastic behavior, and authentication requirement. Has output schema, so return values need not be explained. Complete for a complex optimization 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 coverage is 100%, so baseline is 3. The description does not elaborate on parameter semantics beyond what the schema already provides, so no additional value added.

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 it performs continuous black-box optimization via CMA-ES, giving specific use cases (hyperparameter search, simulator calibration). It distinguishes itself from sibling tools (optimize_evolve for discrete, solve_constraints for LP/MIP).

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 tells when to use (non-convex, noisy, gradient-free continuous optimization) and when not to (discrete or LP/MIP problems), with alternative tool names provided.

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

optimize_contextualA
Read-onlyIdempotent

Pick the best option given a situational context vector (LinUCB contextual bandit). Use when the best option depends on features that vary per call (user demographics, time of day, weather, market regime). Pass observed history so the model can learn per-context preferences. If you have no per-call context features, use optimize_bandit instead. Returns selected arm with expected reward + confidence width.

ParametersJSON Schema
NameRequiredDescriptionDefault
armsYes
contextYesNumeric feature vector describing the current situation. Length must match across calls.
historyNoOptional past observations to seed the model.
alphaNoExploration coefficient (default: 1.0). Higher = more exploration.

Output Schema

ParametersJSON Schema
NameRequiredDescription
selectedYes
scoreYesexpectedReward + alpha * confidenceWidth.
expectedRewardYesLinUCB point estimate of reward.
confidenceWidthYesUncertainty bound on the estimate.
algorithmYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint, idempotentHint, and openWorldHint. The description adds that the tool learns from history to adapt preferences and returns selected arm with expected reward and confidence width, providing behavioral context beyond annotations. No contradictions found.

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 concise (~60 words) and well-structured: first sentence states purpose, second gives usage context, third contrasts with sibling, fourth specifies output. Every sentence serves a clear function with no redundancy.

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

Completeness4/5

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

Given schema coverage and existence of output schema, the description covers key aspects: functionality, when to use, alternative, and output. Minor omission like min arms requirement is in schema. Overall sufficient for an AI agent to correctly invoke the 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?

Schema description coverage is high (75%), so baseline is 3. The description adds value by explaining how to use the history parameter ('seed the model'), which goes beyond the schema's 'Optional past observations'. This incremental guidance justifies a 4.

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 picks the best option using a contextual bandit algorithm (LinUCB). It identifies the resource (options/arms) and the action (optimization based on context). It also distinguishes itself from the sibling tool optimize_bandit by specifying when to use each.

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

Usage Guidelines5/5

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

The description provides explicit guidance: use when the best option depends on per-call context features, and if not, use optimize_bandit. It also advises passing observed history for learning, covering both when-to and when-not-to use the tool.

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

optimize_evolveA
Read-only

Genetic algorithm for combinatorial / discrete optimization with optional Pareto frontier for multi-objective problems. Use when the search space is discrete or mixed (binary feature selection, integer allocation, permutation problems like TSP), or when you want to explore multiple non-dominated solutions. For continuous black-box parameters, use optimize_cmaes — it converges faster on smooth objectives. Stochastic: same input gives different best chromosome each run. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
geneLengthYesNumber of genes (variables) per chromosome.
boundsNo
fitnessWeightsNoPer-gene weights in the default linear fitness sum. Length should equal geneLength.
populationSizeNoDefault: 100, capped at 500.
maxGenerationsNoDefault: 100, capped at 500.
mutationRateNoPer-gene mutation probability (default: 0.01).
crossoverRateNoCrossover probability (default: 0.8).
selectionMethodNoDefault: tournament.
crossoverMethodNoDefault: single-point.

Output Schema

ParametersJSON Schema
NameRequiredDescription
bestChromosomeYes
paretoFrontierNoNon-dominated solutions (multi-objective only).
convergenceGenerationNoGeneration at which best fitness stopped improving.
totalGenerationsYes
executionTimeMsNo
fitnessHistoryNoLast 20 generations' best fitness.

TDQS

A4.4/5.0
Behavior4/5

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

Adds context beyond annotations by disclosing stochastic nature ('same input gives different best chromosome each run') and that it is 'Free'. Annotations already provide readOnlyHint, so description supplements with behavioral traits.

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: purpose, usage guidelines, and stochastic disclosure. Each sentence adds value without redundancy. Front-loaded with most important information.

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?

Covers purpose, domain, alternatives, and stochasticity. Given output schema exists, return values are not required. Minor gap: explicit description of how to set up multi-objective optimization could be helpful, but phrase 'with optional Pareto frontier' sufficiently hints at it.

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 89%, so baseline is 3. Description does not elaborate on parameters beyond mentioning 'optional Pareto frontier' which is implied behavior, not parameter-specific. Adequate but not additional value.

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 it is a 'genetic algorithm for combinatorial / discrete optimization with optional Pareto frontier for multi-objective problems', using specific verb and resource. It distinguishes from sibling optimize_cmaes by domain (discrete vs continuous).

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 says 'Use when the search space is discrete or mixed' and directs to optimize_cmaes for continuous problems. Also mentions stochastic behavior, providing clear when-to-use and when-not-to-use advice.

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

plan_pathfindA
Read-onlyIdempotent

Find the shortest (or k-shortest) path between two nodes in a weighted graph using A* + Yen's algorithm. Use for routing, dependency resolution, project critical-path discovery, or 'how do I get from X to Y' questions on graphs. Set kPaths>1 to also return alternatives. For full graph structure analysis (centrality, communities), use analyze_graph. For task-to-time-slot assignment, use solve_schedule. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodesYes
edgesYes
startYesStart node ID.
endYesGoal node ID.
heuristicNoA* heuristic. 'zero' = Dijkstra (default).
kPathsNoReturn up to k alternative paths (default: 1).

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYesNode IDs from start to end.
totalCostYes
breakdownNo
nodesExploredNo
foundYesFalse if no path exists.
executionTimeMsNo
alternativePathsNoOnly present when kPaths > 1.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds value by naming the specific algorithms (A* + Yen's) and explaining heuristic options, providing behavioral context beyond the annotations.

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

Conciseness5/5

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

The description is four sentences with no wasted words. It front-loads the core purpose and efficiently provides usage context, alternatives, and a key parameter hint. Every sentence serves a clear purpose.

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 complexity (6 params, output schema exists, sibling tools), the description covers the essential purpose, usage, and alternatives. It does not explain how multiple cost fields (time, cost, risk) are used, but the heuristic enum and schema descriptions partially address this. The presence of an output schema reduces the need to describe return values.

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 67% (high), so baseline is 3. The description adds a usage tip for kPaths but does not elaborate on nodes/edges structure or other parameters beyond what schema already provides. The schema descriptions for heuristic, start, end, and kPaths are adequate.

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 finds shortest or k-shortest paths using A* + Yen's algorithm, with specific verb and resource. It distinguishes from siblings by mentioning analyze_graph and solve_schedule as alternatives for different tasks.

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 lists use cases (routing, dependency resolution, critical-path discovery) and provides direct alternatives for when not to use this tool (analyze_graph for graph structure, solve_schedule for scheduling). Also gives guidance on setting kPaths>1 for alternatives.

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

predict_bayesianA
Read-onlyIdempotent

Update a prior probability with weighted evidence using a Beta-Bayesian posterior. Use for incremental belief revision: starting from a baseline probability, fold in new signals (each with a value in [0,1] and a weight) and get an updated posterior plus calibration score. Suited to fraud-risk scoring, A/B test stopping decisions, diagnostic probability stacking. For combining N independent model predictions, use predict_ensemble. For full distribution sampling, use simulate_montecarlo. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
priorYesPrior probability of the event (0..1). Used to seed Beta(prior*10, (1-prior)*10).
evidenceYesPieces of evidence to fold in.

Output Schema

ParametersJSON Schema
NameRequiredDescription
posteriorYesUpdated probability after folding in evidence.
priorProbabilityNo
factorsNo
posteriorMeanYes
posteriorVarianceYes
calibrationScoreNo1 - sqrt(variance); higher = sharper posterior.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide safety profile (readOnly, destructive, idempotent, openWorld). Description adds behavioral context: how prior is seeded (Beta(prior*10, (1-prior)*10)), that it produces a calibration score, and is free. No contradictions.

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

Conciseness5/5

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

Four sentences: purpose, explanation, use cases, alternatives. No unnecessary words, front-loaded with action verb, 'Free.' appended. Every sentence earns its place.

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

Completeness5/5

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

Given the tool's moderate complexity, presence of output schema (not needing return value doc), and complete annotations, the description fully covers purpose, parameters, usage context, and alternatives. No gaps identified.

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 has 100% description coverage, so baseline 3. Description adds the Beta prior seeding formula and clarifies evidence format (value in [0,1], weight). This provides meaning beyond schema definitions.

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?

Description clearly states the tool updates a prior probability with weighted evidence using Beta-Bayesian posterior, specifies exact use cases (fraud-risk scoring, A/B test stopping, diagnostic probability stacking), and distinguishes from siblings predict_ensemble and simulate_montecarlo.

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 (incremental belief revision) and when not to: for combining independent model predictions use predict_ensemble, for full distribution sampling use simulate_montecarlo.

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

predict_ensembleA
Read-onlyIdempotent

Combine N model predictions into a single consensus value using weighted voting, stacking, or Bayesian model averaging. Returns the consensus, decomposed uncertainty (epistemic vs aleatoric), agreement score, weight share per model, and Shannon entropy of the weight distribution. Use to fuse outputs from heterogeneous predictors (statistical + ML + human forecasters). For fusing source-agreement on a probability of one event, use score_convergence. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
predictionsYesPredictions from each model (at least 2).
methodNoCombination method (default: weighted-voting).

Output Schema

ParametersJSON Schema
NameRequiredDescription
consensusYesCombined point prediction.
confidenceYesAggregate confidence.
weightsNomodelId → weight used.
entropyNoShannon entropy of the weight distribution (higher = more diversified).
agreementNoCross-model agreement score (1=all agree, 0=disagree).
uncertaintyNo
modelContributionsNo
methodYes

TDQS

A4.3/5.0
Behavior4/5

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

Description adds context beyond annotations (e.g., returns decomposed uncertainty, agreement score, weight share, entropy). Annotations already cover readOnly, destructive, idempotent, openWorld. No contradictions.

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 purpose and output. The word 'Free.' at end is slightly ambiguous but not misleading. Efficient overall.

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?

Covers purpose, usage, output, and differentiation. Has output schema available. Could mention minimum predictions requirement but overall sufficient.

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%, so baseline 3. Description does not add significant meaning beyond schema; it mentions 'heterogeneous predictors' but doesn't elaborate on parameter details.

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?

Description clearly states 'Combine N model predictions into a single consensus value' and distinguishes from sibling 'score_convergence' by specifying use case for heterogeneous predictors.

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 says when to use (fuse outputs from heterogeneous predictors) and provides an alternative: 'For fusing source-agreement on a probability of one event, use score_convergence.'

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

predict_forecastA
Read-onlyIdempotent

[Premium] Project future values from a univariate time series using ARIMA or Holt-Winters (additive seasonal). Use for short-to-medium horizon point forecasts with confidence bands: demand planning, KPI projection, capacity forecasting. ARIMA suits non-seasonal trend data; Holt-Winters handles repeating seasonality (set seasonLength). Needs at least ~20 observations for stable fit. For point-anomaly flags rather than projection, use detect_anomaly. Requires ORACLAW_API_KEY.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesHistorical values, evenly spaced. ARIMA needs ≥20 points; Holt-Winters needs ≥2 × seasonLength.
stepsYesNumber of future periods to forecast.
methodNoDefault: arima.
seasonLengthNoPeriod of seasonality (only used by holt-winters). Default: 4.

Output Schema

ParametersJSON Schema
NameRequiredDescription
forecastYesPoint forecasts, length = steps.
confidenceNo
modelNoFitted model description.
methodYes
inputLengthNo
stepsYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations declare read-only and idempotent, but description adds premium tier, API key requirement, and confidence bands. No contradiction.

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?

Single efficient paragraph, front-loaded purpose, no fluff, every sentence adds value (use case, model choice, requirements, alternative).

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?

Covers all key aspects: purpose, model selection, data needs, API key, premium tier, and alternative tool, despite presence of output schema (not shown).

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 has 100% description coverage, so baseline 3. Description adds method selection guidance and data constraints (e.g., Holt-Winters needs 2× seasonLength), beyond 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?

Description clearly states projecting future values from univariate time series using ARIMA or Holt-Winters, specifies use cases (demand planning, KPI projection), and distinguishes sibling detect_anomaly.

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 tells when to use ARIMA vs Holt-Winters based on data seasonality, mentions observation requirements, and directs to detect_anomaly for anomaly detection instead.

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

score_calibrationA
Read-onlyIdempotent

Score how well-calibrated a set of probability predictions are against observed binary outcomes using Brier score and log score. Use to evaluate forecaster accuracy, model calibration, prediction-market fairness. Lower Brier/log score = better. predictions[i] is the probability assigned to event i; outcomes[i] is 1 if it happened, 0 otherwise. For comparing multiple forecasters' agreement, use score_convergence instead. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
predictionsYesPredicted probabilities in [0,1].
outcomesYesBinary realised outcomes. Must be the same length as predictions.

Output Schema

ParametersJSON Schema
NameRequiredDescription
brier_scoreYesMean squared error between probability and outcome (lower is better).
log_scoreYesNegative log-likelihood (lower is better; -inf possible if a 0-prob event happens).
n_predictionsYes
mean_predictionNo
mean_outcomeNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true, so the safety profile is clear. The description adds interpretive guidance ('Lower Brier/log score = better') and explains input alignment ('predictions[i]... outcomes[i]...'), which enriches behavioral understanding without contradicting annotations.

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

Conciseness5/5

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

The description is concise at ~100 words, front-loads the main purpose, and every sentence adds value. It includes purpose, usage, metric interpretation, input alignment, alternative tool, and a note about being free, all without redundancy.

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

Completeness5/5

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

Given the presence of an output schema (not shown but indicated), the description does not need to explain return values. It covers purpose, usage, parameter alignment, and alternatives, providing complete context for an agent to use the tool 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%, so parameters are already documented. The description adds context by explaining the index alignment between predictions and outcomes, which is not in the schema. This adds some value but does not provide extensive additional semantics beyond the schema.

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

Purpose5/5

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

The description clearly states the tool's function: scoring calibration of probability predictions using Brier and log scores. It specifies the verb 'score' and the resource 'calibration', and distinguishes itself from the sibling 'score_convergence' by explicitly stating the alternative use case.

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 indicates when to use (evaluate forecaster accuracy, model calibration, prediction-market fairness) and when not to ('for comparing multiple forecasters' agreement, use score_convergence instead'). Provides clear direction for the agent.

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

score_convergenceA
Read-onlyIdempotent

Score how much multiple independent sources agree on a probability estimate, weighting by recency, volume, and confidence. Use to fuse signals from polling, prediction markets, model ensembles, or any source emitting a 0..1 probability. Returns an aggregate convergence score, the consensus probability, and per-pair disagreement so you can see which sources are outliers. Free tier. For comparing pre-binned distributions, prefer this over simulate_montecarlo.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourcesYesIndependent estimators each emitting a probability for the same event.
configNoOptional weighting overrides.

Output Schema

ParametersJSON Schema
NameRequiredDescription
convergenceScoreYesOverall agreement (1=consensus, 0=divergent).
consensusProbabilityNoWeighted aggregate probability.
sourcesNoNumber of sources used.
componentsNoPer-component scores feeding the aggregate.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds behavioral context beyond annotations: it discloses the output ('returns an aggregate convergence score, the consensus probability, and per-pair disagreement'), mentions 'free tier', and implies reading behavior consistent with annotation readOnlyHint=true. No contradictions.

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 concise (two sentences plus a brief note), front-loaded with the core purpose and usage, and every sentence adds value without redundancy.

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

Completeness5/5

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

Given the tool's complexity (nested objects, many optional fields, output schema present), the description is complete: it explains purpose, usage, output, and alternative. With an output schema, return values need not be described in detail.

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 baseline is 3. The description does not add new parameter-level details beyond what the schema already provides, but it also does not need to since the schema is comprehensive.

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

Purpose5/5

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

The description clearly states the tool's action ('score how much multiple independent sources agree'), identifies the resource ('probability estimate'), and distinguishes it from siblings by mentioning 'for comparing pre-binned distributions, prefer this over simulate_montecarlo'.

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

Usage Guidelines5/5

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

The description explicitly recommends use cases ('fuse signals from polling, prediction markets, model ensembles, or any source emitting a 0..1 probability') and provides an alternative ('for comparing pre-binned distributions, prefer this over simulate_montecarlo'), giving clear when-to-use and when-not-to-use guidance.

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

simulate_montecarloA
Read-only

Sample N draws from a parametric distribution and return summary statistics + percentiles + histogram. Use to quantify uncertainty around a single random factor: project NPV with uncertain growth rate, estimate latency tail percentiles, size insurance reserves. Supports normal/lognormal/uniform/triangular/beta/exponential. For multi-asset portfolio risk with correlations, use analyze_risk. Each call re-samples (non-idempotent). Capped at 2000 iterations on the free tier.

ParametersJSON Schema
NameRequiredDescriptionDefault
distributionYesDistribution family to sample from.
paramsYesDistribution parameters. Required keys depend on distribution: normal/lognormal={mean,stddev}, uniform={min,max}, triangular={min,mode,max}, beta={alpha,beta}, exponential={lambda}.
simulationsNoNumber of samples (default: 1000, max: 2000 free).

Output Schema

ParametersJSON Schema
NameRequiredDescription
meanYes
stdDevYes
percentilesYes
histogramNoBucketed counts.
iterationsYes
executionTimeMsNo
timedOutNo

TDQS

A5/5.0
Behavior5/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Description adds specifics: each call re-samples (non-idempotent), capped at 2000 iterations free. No contradiction.

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?

Single concise paragraph, front-loaded with core functionality, then usage, alternative, behavioral notes. Every sentence adds value.

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

Completeness5/5

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

Covers all essentials: 6 distributions, parameter requirements, non-idempotence, free tier cap. Output schema exists for return values, so no need to detail them.

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 100% with detailed descriptions. Description adds meaning by noting required keys depend on distribution and specifying defaults (1000) and limits (2000 free).

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?

Description starts with a specific verb+resource ('Sample N draws from a parametric distribution') and clearly lists returned outputs. It provides concrete use cases and distinguishes from sibling tool analyze_risk.

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 (quantify uncertainty around a single random factor) and when not to (multi-asset portfolio, use analyze_risk). Mentions behavioral details like non-idempotent and free tier cap.

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

simulate_scenarioA
Read-onlyIdempotent

Compare named what-if scenarios against a base case, returning per-scenario outcome delta plus a sensitivity ranking showing which input variables move the outcome most across scenarios. Use for budget sensitivity analysis, deal what-ifs, capacity planning under multiple demand assumptions. The default outcome metric is the sum of input variables — supply scenarios that vary individual drivers to isolate their impact. For random sampling from a distribution, use simulate_montecarlo. Free.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseCaseYesVariable name → baseline value.
scenariosYesNamed what-if scenarios. Each overrides any subset of baseCase variables.

Output Schema

ParametersJSON Schema
NameRequiredDescription
baseCaseYes
resultsYes
sensitivityRankingNoVariables ranked by total absolute swing across scenarios.
scenarioCountYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds that the default outcome metric is the sum of input variables and that scenarios vary individual drivers. This goes beyond annotations, though it could mention output structure.

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, front-loaded with the main action, then use cases, then additional detail and alternative. Every sentence earns its place.

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

Completeness5/5

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

Given schema coverage is 100% and output schema exists, the description covers purpose, usage, default behavior, and alternatives. It feels complete for this tool's complexity.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description restates that scenarios override baseCase variables, which is already in the schema. It does not add significant new semantics beyond overall context.

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?

Explicitly states it compares named what-if scenarios against a base case, returning per-scenario outcome delta and sensitivity ranking. The verb 'compare' and resource 'scenarios' are specific, and it distinguishes from simulate_montecarlo.

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?

Provides explicit use cases: budget sensitivity analysis, deal what-ifs, capacity planning. Also gives a clear alternative: 'For random sampling from a distribution, use simulate_montecarlo.'

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

solve_constraintsA
Read-onlyIdempotent

[Premium] Solve linear / mixed-integer / quadratic programs (HiGHS solver). Use when the objective and constraints are linear (or quadratic) and you need a provably optimal solution: budget allocation across line items, supply chain optimization, capacity planning with integer counts, portfolio construction with hard caps. For continuous black-box objectives, use optimize_cmaes. For task→slot scheduling, use solve_schedule. Returns variable assignments + objective value. Requires ORACLAW_API_KEY.

ParametersJSON Schema
NameRequiredDescriptionDefault
directionYes
objectiveYesMap of variable name → coefficient in the objective function.
variablesYes
constraintsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYese.g. 'optimal', 'infeasible', 'unbounded'.
objectiveValueNoObjective at the optimum (when status='optimal').
variablesNoMap of variable name → solved value.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds value by specifying that the tool returns 'variable assignments + objective value', that it is a solver using HiGHS, and that it requires the ORACLAW_API_KEY. This extra context justifies a score above 3 without contradicting any annotations.

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

Conciseness5/5

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

The description is two sentences and a short note. The first sentence defines the core purpose compactly, the second provides usage guidance and alternative tools, and the third mentions returns and requirements. Every sentence adds distinct value with no redundancy or verbose explanations. This 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?

For a complex optimization tool, the description covers the problem type, optimality guarantee, example domains, and alternative tools. It mentions the return value. However, it omits details about input structure (though schema exists) and does not explain the output schema despite its existence. An agent might need to infer the variable conventions, but the description is largely sufficient for the main scenarios. Could be improved with more param guidance, but overall good.

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 only 25%, meaning most parameters lack schema-level descriptions. The tool description does not compensate: it mentions the type of coefficients but gives no guidance on how to structure direction, objective map, variable list, or constraint objects. For a complex optimization tool, this leaves significant ambiguity for the agent. The use-case examples imply structure but do not directly explain the parameters.

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 what the tool does: 'Solve linear / mixed-integer / quadratic programs (HiGHS solver).' It provides specific examples of use cases (budget allocation, supply chain optimization, etc.) and explicitly distinguishes from sibling tools like optimize_cmaes and solve_schedule, leaving no ambiguity about its purpose.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: 'Use when the objective and constraints are linear (or quadratic) and you need a provably optimal solution.' It also provides clear alternatives: 'For continuous black-box objectives, use optimize_cmaes. For task→slot scheduling, use solve_schedule.' This gives the agent clear decision-making context.

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

solve_scheduleA
Read-onlyIdempotent

Assign tasks to time slots maximizing productivity, matching task energy requirements with slot energy levels. Use specifically for task→slot assignment with energy matching (deep-work scheduling, shift planning, exercise scheduling). For general resource allocation with arbitrary linear constraints, use solve_constraints. For sequence/route problems, use plan_pathfind. Deterministic.

ParametersJSON Schema
NameRequiredDescriptionDefault
tasksYes
slotsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
assignmentsYes
unassignedTasksNoTask IDs that did not fit.
totalScoreNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, etc. The description adds 'Deterministic' behavior, which is beyond annotations. It does not contradict annotations. It could detail edge cases but is sufficient given annotation 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?

The description is three sentences, efficient and front-loaded with the main action and key concepts. No unnecessary words 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?

Given the tool's moderate complexity (two array parameters with nested objects), annotations covering safety and idempotency, and an output schema (present), the description provides sufficient context: purpose, selection criteria, and behavioral note (deterministic). It does not need to explain return values due to output schema.

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 should compensate. It adds the key semantic of 'matching task energy requirements with slot energy levels' which explains the 'energyRequired' and 'energyLevel' fields. However, it doesn't elaborate on task 'priority', slot 'duration', or other properties beyond what names and schema describe.

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 verb (Assign tasks to time slots) and resource (schedule), and explicitly distinguishes from siblings 'solve_constraints' and 'plan_pathfind' by naming them and specifying different use cases (general resource allocation, sequence/route problems).

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance ('Use specifically for task→slot assignment with energy matching') and when-not-to-use by naming alternatives for different problem types. It also lists concrete applications (deep-work scheduling, shift planning, exercise scheduling).

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. 17 tool updates
    • Changedanalyze_graph10 fields changed
      • removedInput schema / properties / edges / description
        "[{source, target, type?, weight?}]"
      • addedInput schema / properties / edges / items / properties
        {
          "source": {
            "type": "string"
          },
          "target": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "weight": {
            "type": "number"
          }
        }
      • addedInput schema / properties / edges / items / required
        [
          "source",
          "target"
        ]
      • removedInput schema / properties / nodes / description
        "[{id, type?, label?, ...}]"
      • addedInput schema / properties / nodes / items / properties
        {
          "confidence": {
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        }
      • addedInput schema / properties / nodes / items / required
        [
          "id"
        ]
      • addedInput schema / properties / nodes / minItems
        1
      • addedInput schema / properties / sourceGoal
        {
          "description": "Optional: node ID to use as start of critical path.",
          "type": "string"
        }
      • addedInput schema / properties / targetGoal
        {
          "description": "Optional: node ID to use as end of critical path.",
          "type": "string"
        }
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "bottlenecks": {
              "description": "Nodes whose removal most disconnects the graph.",
              "type": "array"
            },
            "clusters": {
              "items": {
                "properties": {
                  "avgConfidence": {
                    "type": "number"
                  },
                  "community": {
                    "type": "integer"
                  },
                  "nodes": {
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "type": "object"
              },
              "type": "array"
            },
            "communities": {
              "additionalProperties": {
                "type": "integer"
              },
              "description": "Node ID → community index.",
              "type": "object"
            },
            "criticalPath": {
              "description": "Node IDs from sourceGoal to targetGoal.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "criticalPathWeight": {
              "type": "number"
            },
            "pageRank": {
              "additionalProperties": {
                "type": "number"
              },
              "description": "Node ID → PageRank score.",
              "type": "object"
            },
            "totalNodes": {
              "type": "integer"
            }
          },
          "required": [
            "pageRank",
            "communities",
            "totalNodes"
          ],
          "type": "object"
        }
    • Changedanalyze_risk9 fields changed
      • changedInput schema / properties / confidence / description
        Before
        "Confidence level (default: 0.95)"
        After
        "VaR confidence level (default: 0.95)."
      • addedInput schema / properties / confidence / maximum
        1
      • addedInput schema / properties / confidence / minimum
        0
      • addedInput schema / properties / horizonDays
        {
          "description": "Horizon in days, scales VaR by sqrt(horizon) (default: 1).",
          "minimum": 1,
          "type": "integer"
        }
      • changedInput schema / properties / returns / description
        Before
        "Asset return series"
        After
        "[asset][time] matrix of period returns (e.g. daily). Each row same length."
      • addedInput schema / properties / returns / minItems
        1
      • changedInput schema / properties / weights / description
        Before
        "Portfolio weights"
        After
        "Portfolio weights per asset. Length must equal returns.length. Should sum to 1."
      • addedInput schema / properties / weights / minItems
        1
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "assets": {
              "type": "integer"
            },
            "confidence": {
              "type": "number"
            },
            "cvar": {
              "description": "Conditional VaR (mean loss beyond VaR threshold).",
              "type": "number"
            },
            "expectedReturn": {
              "type": "number"
            },
            "horizonDays": {
              "type": "integer"
            },
            "var": {
              "description": "Value-at-Risk at the requested confidence (loss expressed as positive number).",
              "type": "number"
            },
            "volatility": {
              "type": "number"
            }
          },
          "required": [
            "var",
            "cvar",
            "expectedReturn",
            "volatility"
          ],
          "type": "object"
        }
    • Changeddetect_anomaly5 fields changed
      • changedInput schema / properties / data / description
        Before
        "Numeric data"
        After
        "Numeric series to scan."
      • addedInput schema / properties / data / minItems
        4
      • changedInput schema / properties / method / description
        Before
        "Method (default: zscore)"
        After
        "Default: zscore."
      • changedInput schema / properties / threshold / description
        Before
        "Detection threshold (default: 3.0)"
        After
        "Z-score: standard deviations above mean (default: 3.0). IQR: multiplier on IQR (default: 1.5)."
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "anomalies": {
              "items": {
                "properties": {
                  "index": {
                    "type": "integer"
                  },
                  "score": {
                    "type": "number"
                  },
                  "value": {
                    "type": "number"
                  }
                },
                "type": "object"
              },
              "type": "array"
            },
            "anomalyCount": {
              "type": "integer"
            },
            "method": {
              "enum": [
                "zscore",
                "iqr"
              ],
              "type": "string"
            },
            "stats": {
              "description": "For zscore: {mean, stdDev, threshold}. For iqr: {q1, q3, iqr, lowerBound, upperBound}.",
              "type": "object"
            },
            "totalPoints": {
              "type": "integer"
            }
          },
          "required": [
            "method",
            "anomalies",
            "anomalyCount"
          ],
          "type": "object"
        }
    • Changedoptimize_bandit6 fields changed
      • changedInput schema / properties / algorithm / description
        Before
        "Algorithm (default: ucb1)"
        After
        "Selection algorithm (default: ucb1). UCB1 is deterministic; thompson/epsilon-greedy sample."
      • changedInput schema / properties / arms / description
        Before
        "Options: [{id, name, pulls, totalReward}]"
        After
        "Candidate options to choose between (at least 2)."
      • addedInput schema / properties / arms / items / properties
        {
          "id": {
            "description": "Stable identifier for this arm.",
            "type": "string"
          },
          "name": {
            "description": "Display label.",
            "type": "string"
          },
          "pulls": {
            "description": "Number of times this arm has been tried.",
            "minimum": 0,
            "type": "integer"
          },
          "totalReward": {
            "description": "Cumulative reward across pulls (any scale).",
            "type": "number"
          }
        }
      • addedInput schema / properties / arms / items / required
        [
          "id",
          "name"
        ]
      • addedInput schema / properties / arms / minItems
        2
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "algorithm": {
              "description": "Which algorithm produced the selection.",
              "type": "string"
            },
            "exploitation": {
              "description": "Pure mean-reward component.",
              "type": "number"
            },
            "exploration": {
              "description": "Uncertainty bonus added to exploitation.",
              "type": "number"
            },
            "regret": {
              "description": "Cumulative regret estimate (lower is better).",
              "type": "number"
            },
            "score": {
              "description": "Combined exploitation + exploration score.",
              "type": "number"
            },
            "selected": {
              "description": "The chosen arm.",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name"
              ],
              "type": "object"
            }
          },
          "required": [
            "selected",
            "score",
            "algorithm"
          ],
          "type": "object"
        }
    • Changedoptimize_cmaes12 fields changed
      • changedInput schema / properties / dimension / description
        Before
        "Number of parameters"
        After
        "Number of parameters to optimize."
      • addedInput schema / properties / dimension / minimum
        1
      • changedInput schema / properties / dimension / type
        Before
        "number"
        After
        "integer"
      • addedInput schema / properties / initialMean
        {
          "description": "Optional starting point in parameter space.",
          "items": {
            "type": "number"
          },
          "type": "array"
        }
      • changedInput schema / properties / initialSigma / description
        Before
        "Initial step size (default: 0.3)"
        After
        "Initial step size (default: 0.5)."
      • addedInput schema / properties / initialSigma / minimum
        0
      • changedInput schema / properties / maxIterations / description
        Before
        "Max iterations (default: 200)"
        After
        "Max generations (default: 1000, capped at 5000)."
      • addedInput schema / properties / maxIterations / maximum
        5000
      • addedInput schema / properties / maxIterations / minimum
        1
      • changedInput schema / properties / maxIterations / type
        Before
        "number"
        After
        "integer"
      • changedInput schema / properties / objectiveWeights / description
        Before
        "Weight per dimension"
        After
        "Per-dimension weight in the linear default objective. Length must equal dimension."
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "bestFitness": {
              "description": "Objective value at bestSolution (caller's sign convention).",
              "type": "number"
            },
            "bestSolution": {
              "description": "Best parameter vector found.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "converged": {
              "description": "Whether convergence criteria were met before maxIterations.",
              "type": "boolean"
            },
            "evaluations": {
              "description": "Total objective evaluations.",
              "type": "integer"
            },
            "executionTimeMs": {
              "type": "number"
            },
            "iterations": {
              "description": "Generations actually run.",
              "type": "integer"
            }
          },
          "required": [
            "bestSolution",
            "bestFitness",
            "iterations",
            "converged"
          ],
          "type": "object"
        }
    • Changedoptimize_contextual11 fields changed
      • addedInput schema / properties / alpha
        {
          "description": "Exploration coefficient (default: 1.0). Higher = more exploration.",
          "type": "number"
        }
      • removedInput schema / properties / arms / description
        "[{id, name}]"
      • addedInput schema / properties / arms / items / properties
        {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      • addedInput schema / properties / arms / items / required
        [
          "id",
          "name"
        ]
      • addedInput schema / properties / arms / minItems
        2
      • changedInput schema / properties / context / description
        Before
        "Context feature vector"
        After
        "Numeric feature vector describing the current situation. Length must match across calls."
      • addedInput schema / properties / context / minItems
        1
      • changedInput schema / properties / history / description
        Before
        "Past observations [{armId, reward, context}]"
        After
        "Optional past observations to seed the model."
      • addedInput schema / properties / history / items / properties
        {
          "armId": {
            "type": "string"
          },
          "context": {
            "items": {
              "type": "number"
            },
            "type": "array"
          },
          "reward": {
            "type": "number"
          }
        }
      • addedInput schema / properties / history / items / required
        [
          "armId",
          "reward",
          "context"
        ]
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "algorithm": {
              "const": "linucb",
              "type": "string"
            },
            "confidenceWidth": {
              "description": "Uncertainty bound on the estimate.",
              "type": "number"
            },
            "expectedReward": {
              "description": "LinUCB point estimate of reward.",
              "type": "number"
            },
            "score": {
              "description": "expectedReward + alpha * confidenceWidth.",
              "type": "number"
            },
            "selected": {
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name"
              ],
              "type": "object"
            }
          },
          "required": [
            "selected",
            "score",
            "expectedReward",
            "confidenceWidth",
            "algorithm"
          ],
          "type": "object"
        }
    • Addedoptimize_evolve
    • Changedplan_pathfind15 fields changed
      • removedInput schema / properties / edges / description
        "[{source, target, cost}]"
      • addedInput schema / properties / edges / items / properties
        {
          "cost": {
            "type": "number"
          },
          "from": {
            "type": "string"
          },
          "risk": {
            "type": "number"
          },
          "time": {
            "type": "number"
          },
          "to": {
            "type": "string"
          }
        }
      • addedInput schema / properties / edges / items / required
        [
          "from",
          "to"
        ]
      • addedInput schema / properties / end
        {
          "description": "Goal node ID.",
          "type": "string"
        }
      • removedInput schema / properties / goal
        {
          "description": "Goal node ID",
          "type": "string"
        }
      • addedInput schema / properties / heuristic
        {
          "description": "A* heuristic. 'zero' = Dijkstra (default).",
          "enum": [
            "zero",
            "time",
            "cost",
            "risk",
            "weighted"
          ],
          "type": "string"
        }
      • removedInput schema / properties / k
        {
          "description": "Number of paths (default: 1)",
          "type": "number"
        }
      • addedInput schema / properties / kPaths
        {
          "description": "Return up to k alternative paths (default: 1).",
          "minimum": 1,
          "type": "integer"
        }
      • removedInput schema / properties / nodes / description
        "[{id, x?, y?}]"
      • addedInput schema / properties / nodes / items / properties
        {
          "cost": {
            "description": "Heuristic cost estimate at this node (used by 'cost' heuristic).",
            "type": "number"
          },
          "id": {
            "type": "string"
          },
          "risk": {
            "type": "number"
          },
          "time": {
            "type": "number"
          }
        }
      • addedInput schema / properties / nodes / items / required
        [
          "id"
        ]
      • addedInput schema / properties / nodes / minItems
        2
      • changedInput schema / properties / start / description
        Before
        "Start node ID"
        After
        "Start node ID."
      • changedInput schema / required
        Before
        [
          "nodes",
          "edges",
          "start",
          "goal"
        ]
        After
        [
          "nodes",
          "edges",
          "start",
          "end"
        ]
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "alternativePaths": {
              "description": "Only present when kPaths > 1.",
              "items": {
                "properties": {
                  "cost": {
                    "type": "number"
                  },
                  "path": {
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "type": "object"
              },
              "type": "array"
            },
            "breakdown": {
              "properties": {
                "cost": {
                  "type": "number"
                },
                "risk": {
                  "type": "number"
                },
                "time": {
                  "type": "number"
                }
              },
              "type": "object"
            },
            "executionTimeMs": {
              "type": "number"
            },
            "found": {
              "description": "False if no path exists.",
              "type": "boolean"
            },
            "nodesExplored": {
              "type": "integer"
            },
            "path": {
              "description": "Node IDs from start to end.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "totalCost": {
              "type": "number"
            }
          },
          "required": [
            "path",
            "totalCost",
            "found"
          ],
          "type": "object"
        }
    • Addedpredict_bayesian
    • Addedpredict_ensemble
    • Changedpredict_forecast8 fields changed
      • changedInput schema / properties / data / description
        Before
        "Historical values"
        After
        "Historical values, evenly spaced. ARIMA needs ≥20 points; Holt-Winters needs ≥2 × seasonLength."
      • addedInput schema / properties / data / minItems
        2
      • changedInput schema / properties / method / description
        Before
        "Method (default: arima)"
        After
        "Default: arima."
      • addedInput schema / properties / seasonLength
        {
          "description": "Period of seasonality (only used by holt-winters). Default: 4.",
          "minimum": 2,
          "type": "integer"
        }
      • changedInput schema / properties / steps / description
        Before
        "Steps to forecast"
        After
        "Number of future periods to forecast."
      • addedInput schema / properties / steps / minimum
        1
      • changedInput schema / properties / steps / type
        Before
        "number"
        After
        "integer"
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "confidence": {
              "properties": {
                "level": {
                  "description": "e.g. 0.95",
                  "type": "number"
                },
                "lower": {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                },
                "upper": {
                  "items": {
                    "type": "number"
                  },
                  "type": "array"
                }
              },
              "type": "object"
            },
            "forecast": {
              "description": "Point forecasts, length = steps.",
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "inputLength": {
              "type": "integer"
            },
            "method": {
              "enum": [
                "arima",
                "holt-winters"
              ],
              "type": "string"
            },
            "model": {
              "description": "Fitted model description.",
              "type": "string"
            },
            "steps": {
              "type": "integer"
            }
          },
          "required": [
            "forecast",
            "method",
            "steps"
          ],
          "type": "object"
        }
    • Addedscore_calibration
    • Changedscore_convergence5 fields changed
      • addedInput schema / properties / config
        {
          "description": "Optional weighting overrides.",
          "properties": {
            "freshnessHalfLifeMs": {
              "minimum": 1,
              "type": "number"
            },
            "outlierThreshold": {
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "scale": {
              "type": "number"
            },
            "shift": {
              "type": "number"
            },
            "wA": {
              "description": "Weight on agreement component.",
              "type": "number"
            },
            "wD": {
              "description": "Weight on dispersion penalty.",
              "type": "number"
            },
            "wF": {
              "description": "Weight on freshness.",
              "type": "number"
            },
            "wU": {
              "description": "Weight on uncertainty penalty.",
              "type": "number"
            }
          },
          "type": "object"
        }
      • removedInput schema / properties / distributions
        {
          "description": "[{sourceId, values: number[]}]",
          "items": {
            "type": "object"
          },
          "type": "array"
        }
      • addedInput schema / properties / sources
        {
          "description": "Independent estimators each emitting a probability for the same event.",
          "items": {
            "properties": {
              "confidence": {
                "description": "Optional. Source-reported certainty.",
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "id": {
                "description": "Stable source identifier.",
                "type": "string"
              },
              "lastUpdated": {
                "description": "Optional. Unix epoch ms; older sources are downweighted.",
                "type": "integer"
              },
              "name": {
                "description": "Display label.",
                "type": "string"
              },
              "probability": {
                "description": "This source's probability estimate.",
                "maximum": 1,
                "minimum": 0,
                "type": "number"
              },
              "volume": {
                "description": "Optional. Sample size / liquidity behind the estimate.",
                "minimum": 0,
                "type": "number"
              }
            },
            "required": [
              "id",
              "name",
              "probability"
            ],
            "type": "object"
          },
          "minItems": 1,
          "type": "array"
        }
      • changedInput schema / required
        Before
        [
          "distributions"
        ]
        After
        [
          "sources"
        ]
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "components": {
              "description": "Per-component scores feeding the aggregate.",
              "type": "object"
            },
            "consensusProbability": {
              "description": "Weighted aggregate probability.",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "convergenceScore": {
              "description": "Overall agreement (1=consensus, 0=divergent).",
              "maximum": 1,
              "minimum": 0,
              "type": "number"
            },
            "sources": {
              "description": "Number of sources used.",
              "type": "integer"
            }
          },
          "required": [
            "convergenceScore"
          ],
          "type": "object"
        }
    • Changedsimulate_montecarlo8 fields changed
      • changedInput schema / properties / distribution / description
        Before
        "{type: 'normal'|'uniform'|'triangular', params: number[]}"
        After
        "Distribution family to sample from."
      • addedInput schema / properties / distribution / enum
        [
          "normal",
          "lognormal",
          "uniform",
          "triangular",
          "beta",
          "exponential"
        ]
      • changedInput schema / properties / distribution / type
        Before
        "object"
        After
        "string"
      • removedInput schema / properties / iterations
        {
          "description": "Number of iterations (default: 5000)",
          "type": "number"
        }
      • addedInput schema / properties / params
        {
          "description": "Distribution parameters. Required keys depend on distribution: normal/lognormal={mean,stddev}, uniform={min,max}, triangular={min,mode,max}, beta={alpha,beta}, exponential={lambda}.",
          "properties": {
            "alpha": {
              "type": "number"
            },
            "beta": {
              "type": "number"
            },
            "lambda": {
              "type": "number"
            },
            "max": {
              "type": "number"
            },
            "mean": {
              "type": "number"
            },
            "min": {
              "type": "number"
            },
            "mode": {
              "type": "number"
            },
            "stddev": {
              "type": "number"
            }
          },
          "type": "object"
        }
      • addedInput schema / properties / simulations
        {
          "description": "Number of samples (default: 1000, max: 2000 free).",
          "maximum": 2000,
          "minimum": 1,
          "type": "integer"
        }
      • changedInput schema / required
        Before
        [
          "distribution"
        ]
        After
        [
          "distribution",
          "params"
        ]
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "executionTimeMs": {
              "type": "number"
            },
            "histogram": {
              "description": "Bucketed counts.",
              "items": {
                "type": "object"
              },
              "type": "array"
            },
            "iterations": {
              "type": "integer"
            },
            "mean": {
              "type": "number"
            },
            "percentiles": {
              "properties": {
                "p25": {
                  "type": "number"
                },
                "p5": {
                  "type": "number"
                },
                "p50": {
                  "type": "number"
                },
                "p75": {
                  "type": "number"
                },
                "p95": {
                  "type": "number"
                }
              },
              "type": "object"
            },
            "stdDev": {
              "type": "number"
            },
            "timedOut": {
              "type": "boolean"
            }
          },
          "required": [
            "mean",
            "stdDev",
            "percentiles",
            "iterations"
          ],
          "type": "object"
        }
    • Addedsimulate_scenario
    • Changedsolve_constraints9 fields changed
      • removedInput schema / properties / constraints / description
        "[{name, coefficients, upper?, lower?}]"
      • addedInput schema / properties / constraints / items / properties
        {
          "coefficients": {
            "additionalProperties": {
              "type": "number"
            },
            "type": "object"
          },
          "lower": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "upper": {
            "type": "number"
          }
        }
      • addedInput schema / properties / constraints / items / required
        [
          "name",
          "coefficients"
        ]
      • addedInput schema / properties / objective / additionalProperties
        {
          "type": "number"
        }
      • changedInput schema / properties / objective / description
        Before
        "Variable → coefficient"
        After
        "Map of variable name → coefficient in the objective function."
      • removedInput schema / properties / variables / description
        "[{name, lower?, upper?, type?}]"
      • addedInput schema / properties / variables / items / properties
        {
          "lower": {
            "description": "Lower bound (default: 0 / -inf depending on type).",
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "description": "Default: continuous.",
            "enum": [
              "continuous",
              "integer",
              "binary"
            ],
            "type": "string"
          },
          "upper": {
            "description": "Upper bound (default: +inf).",
            "type": "number"
          }
        }
      • addedInput schema / properties / variables / items / required
        [
          "name"
        ]
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "objectiveValue": {
              "description": "Objective at the optimum (when status='optimal').",
              "type": "number"
            },
            "status": {
              "description": "e.g. 'optimal', 'infeasible', 'unbounded'.",
              "type": "string"
            },
            "variables": {
              "additionalProperties": {
                "type": "number"
              },
              "description": "Map of variable name → solved value.",
              "type": "object"
            }
          },
          "required": [
            "status"
          ],
          "type": "object"
        }
    • Changedsolve_schedule9 fields changed
      • removedInput schema / properties / slots / description
        "[{id, name, duration, energyLevel}]"
      • addedInput schema / properties / slots / items / properties
        {
          "duration": {
            "type": "number"
          },
          "energyLevel": {
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      • addedInput schema / properties / slots / items / required
        [
          "id",
          "duration"
        ]
      • addedInput schema / properties / slots / minItems
        1
      • removedInput schema / properties / tasks / description
        "[{id, name, duration, priority, energyRequired}]"
      • addedInput schema / properties / tasks / items / properties
        {
          "duration": {
            "description": "Required slot duration (minutes).",
            "type": "number"
          },
          "energyRequired": {
            "description": "0..1 energy demand.",
            "maximum": 1,
            "minimum": 0,
            "type": "number"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "priority": {
            "description": "Higher = more important.",
            "type": "number"
          }
        }
      • addedInput schema / properties / tasks / items / required
        [
          "id",
          "duration"
        ]
      • addedInput schema / properties / tasks / minItems
        1
      • changedOutput schema / (root)
        Before
        null
        After
        {
          "properties": {
            "assignments": {
              "items": {
                "properties": {
                  "score": {
                    "type": "number"
                  },
                  "slotId": {
                    "type": "string"
                  },
                  "taskId": {
                    "type": "string"
                  }
                },
                "required": [
                  "taskId",
                  "slotId"
                ],
                "type": "object"
              },
              "type": "array"
            },
            "totalScore": {
              "type": "number"
            },
            "unassignedTasks": {
              "description": "Task IDs that did not fit.",
              "items": {
                "type": "string"
              },
              "type": "array"
            }
          },
          "required": [
            "assignments"
          ],
          "type": "object"
        }
  2. 12 tool updatesv1.0.1
    • First observedanalyze_graph
    • First observedanalyze_risk
    • First observeddetect_anomaly
    • First observedoptimize_bandit
    • First observedoptimize_cmaes
    • First observedoptimize_contextual
    • First observedplan_pathfind
    • First observedpredict_forecast
    • First observedscore_convergence
    • First observedsimulate_montecarlo
    • First observedsolve_constraints
    • First observedsolve_schedule

TDQS

A4.6/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose, with descriptions that guide selection among related tools (e.g., optimize_bandit vs. optimize_contextual, analyze_graph vs. plan_pathfind). No two tools appear to overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent `verb_noun` pattern with lowercase and underscores (e.g., `analyze_graph`, `predict_bayesian`, `solve_schedule`). The naming is predictable and clear throughout.

Tool Count5/5

With 17 tools covering optimization, prediction, simulation, risk, graph analysis, scheduling, and constraints, the count is well-scoped for a general-purpose analytical toolkit. Each tool earns its place without overwhelming the surface.

Completeness4/5

The tool surface provides comprehensive coverage for the stated domain (decision support, analytics, optimization). Minor gaps exist, such as missing tools for simple regression or categorical classification, but core workflows like prediction, simulation, and optimization are well-covered.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Provides 21 mathematical tools across 6 domains including basic calculations, array operations, statistics, financial mathematics, linear algebra, and calculus. Supports batch execution for complex multi-step workflows with intelligent dependency resolution.
    21
    6
    MIT
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Arithym — lightweight precision math for agents on the go. Exact arithmetic MCP server with 62 tools, zero hallucination, sub-millisecond computation and is 61% cheaper than Python code execution at scale.
    -
  • A
    license
    A
    quality
    A
    maintenance
    AI Agent Mission Control — 200+ MCP tools across 31 domains. Manage agents, experiments, workflows, crews, skills, tools, credentials, approvals, signals, budgets, marketplace, knowledge bases, chatbots, and more. Self-hosted, open-source (AGPL-3.0). Supports stdio + Streamable HTTP/SSE with OAuth 2.0 auth.
    34
    65
    AGPL 3.0

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/Whatsonyourmind/oraclaw'

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