An MCP Server for Chronulus AI Forecasting and Prediction Agents
Chronulus MCP has reasonable tool naming and parameter schemas, but descriptions are inconsistent in depth and quality. 8 of 9 tools have solid input schemas with type information and field descriptions. However, output schemas are not documented in the server code, we can infer what fields are returned from function signatures and docstrings, but no explicit response schema definitions are visible. Error handling exists in implementation (try/catch blocks in forecaster.py) but error messages are not standardized with recovery guidance. Most tool descriptions are 50-150 characters, meeting the baseline, but lack dependency hints (e.g., 'requires a valid session_id from create_chronulus_session') and WHEN-to-use guidance. The naming is strong and consistent (verb-noun pattern: create_*, get_*, reuse_*, save_*), but composition issues exist: tools like 'create_forecasting_agent_and_get_forecast' and 'reuse_forecasting_agent_and_get_forecast' violate single-responsibility, they queue AND retrieve in one call, making partial failure recovery unclear.
Creates a new Chronulus Session A Chronulus Session allows you to use Chronulus Agents. To create a session, you need to provide a situation and task. Once created, this will generate a unique session id that can be used to when calling the agents.
Queues and retrieves a forecast from Chronulus with a predefined session_id This tool creates a NormalizedForecaster agent and then provides a forecast input to the agent and returns the prediction data and text explanation from the agent.
Queues and retrieves a binary event prediction from Chronulus with a predefined session_id This tool creates a BinaryPredictor agent and then provides a prediction input to the agent and returns the prediction data and text explanations from each of the experts consulted by the agent.
Get the risk assessment scorecard for the Session
Rescales prediction data from the NormalizedForecaster agent
Output schemas not documented. No explicit response schema definitions in server code. LLMs cannot predict what fields forecasting tools return (prediction_id, agent_id, forecast_data structure, explanation format). Inferred from docstrings only.
Tools combine multiple responsibilities (create + get, queue + retrieve). 'create_forecasting_agent_and_get_forecast' both creates an agent AND fetches forecast in one call. If retrieval fails after agent creation succeeds, recovery is opaque, agent is orphaned. Violates single-responsibility principle.
Descriptions lack dependency hints and WHEN-to-use guidance. 'get_risk_assessment_scorecard' does not say 'Call this AFTER create_chronulus_session'. 'create_forecasting_agent_and_get_forecast' does not explain when to use vs 'reuse_forecasting_agent_and_get_forecast'. LLMs cannot disambiguate tool selection.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 14 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 47 | - | v1 |
Queues and retrieves a forecast from Chronulus with a previously created agent_id This tool provides a forecast input to a previous created Chronulus NormalizedForecaster agent and returns the prediction data and text explanation from the agent.
Queues and retrieves a binary event prediction from Chronulus with a previously created agent_id This tool provides a prediction input to a previous created Chronulus BinaryPredictor agent and returns the prediction data and text explanations from each of the experts consulted by the agent.
Saves the forecast from a NormalizedForecaster agent to CSV and the explanation to TXT
Saves the analysis from a BinaryPredictor prediction to an HTML file
Error handling lacks recovery guidance. In forecaster.py, errors return bare exception strings: 'Failed to retrieve session with session_id: {session_id}\n\n{e}'. Does not suggest next steps: Should I try a different session_id? Call create_chronulus_session? Is this retryable?
Parameter descriptions use vague language. 'input_data_model' described as 'Metadata on the fields you will include in the input_data.' But LLMs need to know: Is this a list of field names? A JSON schema? Do I pass field descriptions? Format is List[InputField] but the description doesn't explain what InputField is.
No idempotency guarantees documented. Calling 'create_forecasting_agent_and_get_forecast' twice with identical inputs, does it create two agents? Reuse the same? If retry semantics are unclear, agents cannot safely retry on transient failures.
save_* tools accept 'output_path' parameter but do not document: Can this be an absolute path? Relative? Must it exist? Can we create parent directories? What happens if path is not writable? LLMs guess and fail.
Enum constraints missing for constrained parameters. 'time_scale' accepts 'hours', 'days', 'weeks' but is defined as a plain string, not an enum. LLMs will hallucinate values like 'months', 'years', 'hourly'. Should use Literal['hours', 'days', 'weeks'].