CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/koog

Koog 1.0 idioms, gotchas, and scaffolding skills for Kotlin agents on the JVM

86

1.86x
Quality

88%

Does it follow best practices?

Impact

86%

1.86x

Average score across 45 eval scenarios

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-37/

{
  "context": "Tests whether the agent merges the MCP-derived registry with the existing local registry using ToolRegistry composition, rather than replacing the local tools, mutating the registry after construction, or jamming everything into one builder block.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Composes the two registries with +",
      "description": "Combines the existing local registry and the MCP registry by adding them with + (e.g., localRegistry + mcpRegistry). Does NOT discard either registry, does NOT re-instantiate CalculatorTools inside the MCP block, does NOT use any other ad-hoc merging approach",
      "max_score": 30
    },
    {
      "name": "Preserves the existing CalculatorTools registration",
      "description": "The final toolRegistry passed to AIAgent(...) still contains CalculatorTools — visible either as the original ToolRegistry { tools(CalculatorTools().asTools()) } expression or an equivalent reconstruction. The local tools are not silently dropped",
      "max_score": 20
    },
    {
      "name": "Uses the modern HTTP MCP transport",
      "description": "Builds the MCP registry with McpToolRegistryProvider.streamableHttp { ... } against the given URL. Does not fall back to fromSseUrl when the server supports the modern transport",
      "max_score": 20
    },
    {
      "name": "Adds the agents-mcp dependency",
      "description": "Adds `ai.koog:agents-mcp-jvm:1.0.0-beta` to build.gradle.kts since the umbrella does not include MCP. Requires the `-jvm` suffix (only JVM variants publish at this version) and the `1.0.0-beta` version tag",
      "max_score": 10
    },
    {
      "name": "Constructs the merged registry before AIAgent(...)",
      "description": "Builds both registries and merges them into a final value BEFORE calling AIAgent(...), then passes the merged value as toolRegistry. Does not try to mutate the agent's registry after construction",
      "max_score": 10
    },
    {
      "name": "Calls the suspending MCP builder inside a coroutine context",
      "description": "Invokes McpToolRegistryProvider.streamableHttp(...) inside runBlocking { ... } or another coroutine scope, since it is suspending",
      "max_score": 10
    }
  ]
}

evals

README.md

tile.json