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-40/

{
  "context": "Tests whether the agent picks the primary 1.0 MCP transport (Streamable HTTP) when the server supports it, rather than defaulting to the older SSE transport that hosted Koog docs may still lead with.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Uses the Streamable HTTP transport",
      "description": "Builds the MCP tool registry with McpToolRegistryProvider.streamableHttp { ... }. Does NOT use fromSseUrl (the older transport) when the server supports the modern one",
      "max_score": 30
    },
    {
      "name": "Adds the agents-mcp dependency",
      "description": "Adds the MCP client dependency `ai.koog:agents-mcp-jvm:1.0.0-beta` to build.gradle.kts. The umbrella koog-agents does not include MCP, so the dependency must be added explicitly. The artifact requires the `-jvm` suffix (only JVM variants are published at this version) and the `1.0.0-beta` version (Koog 1.0 stable did not publish `agents-mcp` at `1.0.0`)",
      "max_score": 20
    },
    {
      "name": "Passes the server URL to the transport configuration",
      "description": "Sets the url to the developer's value (https://mcp.github.example/v1) inside the streamableHttp configuration block",
      "max_score": 10
    },
    {
      "name": "Builds the registry before constructing the agent",
      "description": "Calls McpToolRegistryProvider.streamableHttp(...) and assigns its result to a variable BEFORE the AIAgent(...) call, then passes that variable as toolRegistry. Does not try to add MCP tools after the agent is constructed",
      "max_score": 15
    },
    {
      "name": "Calls the suspending builder inside a coroutine context",
      "description": "The streamableHttp builder is invoked inside the existing runBlocking { ... } (or another coroutine scope) — not at top-level outside a suspending context",
      "max_score": 10
    },
    {
      "name": "Reads the GitHub token from the environment",
      "description": "Reads the personal access token from an environment variable (e.g., GITHUB_PERSONAL_ACCESS_TOKEN) via System.getenv. Does not embed the token literal in source",
      "max_score": 10
    },
    {
      "name": "Passes the token as a bearer header in the transport config",
      "description": "Configures the transport (within the streamableHttp block, via the supported headers / auth mechanism) to send the token as a bearer Authorization header on requests to the server",
      "max_score": 5
    }
  ]
}

evals

README.md

tile.json