[INFO] cloning repository https://github.com/Brandon168/hevy-mcp-rust [INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/Brandon168/hevy-mcp-rust" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FBrandon168%2Fhevy-mcp-rust", kill_on_drop: false }` [INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FBrandon168%2Fhevy-mcp-rust'... [INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }` [INFO] [stdout] 4986d8edc83c77c2a03193c58065283be42153e2 [INFO] testing Brandon168/hevy-mcp-rust against 1.97.0-beta.6 for beta-1.98-1 [INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FBrandon168%2Fhevy-mcp-rust" "/workspace/builds/worker-0-tc1/source", kill_on_drop: false }` [INFO] [stderr] Cloning into '/workspace/builds/worker-0-tc1/source'... [INFO] [stderr] done. [INFO] started tweaking git repo https://github.com/Brandon168/hevy-mcp-rust [INFO] finished tweaking git repo https://github.com/Brandon168/hevy-mcp-rust [INFO] tweaked toml for git repo https://github.com/Brandon168/hevy-mcp-rust written to /workspace/builds/worker-0-tc1/source/Cargo.toml [INFO] validating manifest of git repo https://github.com/Brandon168/hevy-mcp-rust on toolchain 1.97.0-beta.6 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.97.0-beta.6" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate git repo https://github.com/Brandon168/hevy-mcp-rust already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.97.0-beta.6" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded num_cpus v1.17.0 [INFO] [stderr] Downloaded wasm-bindgen-macro v0.2.111 [INFO] [stderr] Downloaded assert-json-diff v2.0.2 [INFO] [stderr] Downloaded ipnet v2.11.0 [INFO] [stderr] Downloaded deadpool-runtime v0.1.4 [INFO] [stderr] Downloaded rand_core v0.10.0 [INFO] [stderr] Downloaded schemars_derive v1.2.1 [INFO] [stderr] Downloaded wasm-bindgen v0.2.111 [INFO] [stderr] Downloaded uuid v1.21.0 [INFO] [stderr] Downloaded clap_lex v1.0.0 [INFO] [stderr] Downloaded wasm-bindgen-macro-support v0.2.111 [INFO] [stderr] Downloaded rand v0.10.0 [INFO] [stderr] Downloaded pastey v0.2.1 [INFO] [stderr] Downloaded hyper-tls v0.6.0 [INFO] [stderr] Downloaded clap_derive v4.5.55 [INFO] [stderr] Downloaded anstyle v1.0.13 [INFO] [stderr] Downloaded schannel v0.1.28 [INFO] [stderr] Downloaded getrandom v0.4.1 [INFO] [stderr] Downloaded tempfile v3.25.0 [INFO] [stderr] Downloaded wasm-bindgen-shared v0.2.111 [INFO] [stderr] Downloaded wasm-bindgen-futures v0.4.61 [INFO] [stderr] Downloaded clap v4.5.60 [INFO] [stderr] Downloaded anstream v0.6.21 [INFO] [stderr] Downloaded regex-syntax v0.8.9 [INFO] [stderr] Downloaded deadpool v0.12.3 [INFO] [stderr] Downloaded sse-stream v0.2.1 [INFO] [stderr] Downloaded process-wrap v9.0.1 [INFO] [stderr] Downloaded rmcp-macros v0.16.0 [INFO] [stderr] Downloaded native-tls v0.2.18 [INFO] [stderr] Downloaded wiremock v0.6.5 [INFO] [stderr] Downloaded rmcp v0.16.0 [INFO] [stderr] Downloaded chrono v0.4.43 [INFO] [stderr] Downloaded js-sys v0.3.88 [INFO] [stderr] Downloaded openssl-sys v0.9.111 [INFO] [stderr] Downloaded clap_builder v4.5.60 [INFO] [stderr] Downloaded openssl v0.10.75 [INFO] [stderr] Downloaded rustls v0.23.36 [INFO] [stderr] Downloaded web-sys v0.3.88 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:3d5ced03c013a94a2f102a4510f48a6e9184255caf5fd8244f58017bde7f5210" "sleep" "infinity", kill_on_drop: false }` [INFO] [stdout] 92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c [INFO] running `Command { std: "docker" "start" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stderr] Compiling proc-macro2 v1.0.106 [INFO] [stderr] Compiling unicode-ident v1.0.24 [INFO] [stderr] Compiling quote v1.0.44 [INFO] [stderr] Compiling libc v0.2.182 [INFO] [stderr] Compiling cfg-if v1.0.4 [INFO] [stderr] Compiling smallvec v1.15.1 [INFO] [stderr] Compiling futures-core v0.3.32 [INFO] [stderr] Compiling bytes v1.11.1 [INFO] [stderr] Compiling itoa v1.0.17 [INFO] [stderr] Compiling parking_lot_core v0.9.12 [INFO] [stderr] Compiling log v0.4.29 [INFO] [stderr] Compiling futures-sink v0.3.32 [INFO] [stderr] Compiling slab v0.4.12 [INFO] [stderr] Compiling lock_api v0.4.14 [INFO] [stderr] Compiling tracing-core v0.1.36 [INFO] [stderr] Compiling stable_deref_trait v1.2.1 [INFO] [stderr] Compiling memchr v2.8.0 [INFO] [stderr] Compiling futures-io v0.3.32 [INFO] [stderr] Compiling futures-task v0.3.32 [INFO] [stderr] Compiling find-msvc-tools v0.1.9 [INFO] [stderr] Compiling futures-channel v0.3.32 [INFO] [stderr] Compiling serde_core v1.0.228 [INFO] [stderr] Compiling vcpkg v0.2.15 [INFO] [stderr] Compiling zmij v1.0.21 [INFO] [stderr] Compiling hashbrown v0.16.1 [INFO] [stderr] Compiling bitflags v2.11.0 [INFO] [stderr] Compiling cc v1.2.56 [INFO] [stderr] Compiling litemap v0.8.1 [INFO] [stderr] Compiling http v1.4.0 [INFO] [stderr] Compiling tower-service v0.3.3 [INFO] [stderr] Compiling writeable v0.6.2 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling icu_properties_data v2.1.2 [INFO] [stderr] Compiling percent-encoding v2.3.2 [INFO] [stderr] Compiling httparse v1.10.1 [INFO] [stderr] Compiling icu_normalizer_data v2.1.1 [INFO] [stderr] Compiling strsim v0.11.1 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling atomic-waker v1.1.2 [INFO] [stderr] Compiling fnv v1.0.7 [INFO] [stderr] Compiling openssl v0.10.75 [INFO] [stderr] Compiling try-lock v0.2.5 [INFO] [stderr] Compiling autocfg v1.5.0 [INFO] [stderr] Compiling foreign-types-shared v0.1.1 [INFO] [stderr] Compiling foreign-types v0.3.2 [INFO] [stderr] Compiling want v0.3.1 [INFO] [stderr] Compiling sync_wrapper v1.0.2 [INFO] [stderr] Compiling base64 v0.22.1 [INFO] [stderr] Compiling native-tls v0.2.18 [INFO] [stderr] Compiling ident_case v1.0.1 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Compiling tower-layer v0.3.3 [INFO] [stderr] Compiling rand_core v0.10.0 [INFO] [stderr] Compiling getrandom v0.4.1 [INFO] [stderr] Compiling http-body v1.0.1 [INFO] [stderr] Compiling pin-utils v0.1.0 [INFO] [stderr] Compiling httpdate v1.0.3 [INFO] [stderr] Compiling nix v0.30.1 [INFO] [stderr] Compiling http-body-util v0.1.3 [INFO] [stderr] Compiling form_urlencoded v1.2.2 [INFO] [stderr] Compiling utf8parse v0.2.2 [INFO] [stderr] Compiling openssl-probe v0.2.1 [INFO] [stderr] Compiling ref-cast v1.0.25 [INFO] [stderr] Compiling ipnet v2.11.0 [INFO] [stderr] Compiling anstyle-parse v0.2.7 [INFO] [stderr] Compiling thiserror v2.0.18 [INFO] [stderr] Compiling ryu v1.0.23 [INFO] [stderr] Compiling cpufeatures v0.3.0 [INFO] [stderr] Compiling indexmap v2.13.0 [INFO] [stderr] Compiling anstyle-query v1.1.5 [INFO] [stderr] Compiling anstyle v1.0.13 [INFO] [stderr] Compiling colorchoice v1.0.4 [INFO] [stderr] Compiling utf8_iter v1.0.4 [INFO] [stderr] Compiling syn v2.0.117 [INFO] [stderr] Compiling mime v0.3.17 [INFO] [stderr] Compiling iana-time-zone v0.1.65 [INFO] [stderr] Compiling is_terminal_polyfill v1.70.2 [INFO] [stderr] Compiling regex-syntax v0.8.9 [INFO] [stderr] Compiling anstream v0.6.21 [INFO] [stderr] Compiling chacha20 v0.10.0 [INFO] [stderr] Compiling lazy_static v1.5.0 [INFO] [stderr] Compiling clap_lex v1.0.0 [INFO] [stderr] Compiling iri-string v0.7.10 [INFO] [stderr] Compiling anyhow v1.0.102 [INFO] [stderr] Compiling zeroize v1.8.2 [INFO] [stderr] Compiling errno v0.3.14 [INFO] [stderr] Compiling signal-hook-registry v1.4.8 [INFO] [stderr] Compiling mio v1.1.1 [INFO] [stderr] Compiling socket2 v0.6.2 [INFO] [stderr] Compiling openssl-sys v0.9.111 [INFO] [stderr] Compiling dyn-clone v1.0.20 [INFO] [stderr] Compiling rmcp v0.16.0 [INFO] [stderr] Compiling uuid v1.21.0 [INFO] [stderr] Compiling rand v0.10.0 [INFO] [stderr] Compiling rustls-pki-types v1.14.0 [INFO] [stderr] Compiling parking_lot v0.12.5 [INFO] [stderr] Compiling clap_builder v4.5.60 [INFO] [stderr] Compiling sharded-slab v0.1.7 [INFO] [stderr] Compiling tracing-log v0.2.0 [INFO] [stderr] Compiling thread_local v1.1.9 [INFO] [stderr] Compiling encoding_rs v0.8.35 [INFO] [stderr] Compiling pastey v0.2.1 [INFO] [stderr] Compiling matchit v0.8.4 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling nu-ansi-term v0.50.3 [INFO] [stderr] Compiling dotenvy v0.15.7 [INFO] [stderr] Compiling serde_path_to_error v0.1.20 [INFO] [stderr] Compiling matchers v0.2.0 [INFO] [stderr] Compiling synstructure v0.13.2 [INFO] [stderr] Compiling darling_core v0.23.0 [INFO] [stderr] Compiling serde_derive_internals v0.29.1 [INFO] [stderr] Compiling tokio-macros v2.6.0 [INFO] [stderr] Compiling tracing-attributes v0.1.31 [INFO] [stderr] Compiling zerovec-derive v0.11.2 [INFO] [stderr] Compiling futures-macro v0.3.32 [INFO] [stderr] Compiling displaydoc v0.2.5 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling openssl-macros v0.1.1 [INFO] [stderr] Compiling ref-cast-impl v1.0.25 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling async-trait v0.1.89 [INFO] [stderr] Compiling clap_derive v4.5.55 [INFO] [stderr] Compiling zerofrom-derive v0.1.6 [INFO] [stderr] Compiling yoke-derive v0.8.1 [INFO] [stderr] Compiling schemars_derive v1.2.1 [INFO] [stderr] Compiling tokio v1.49.0 [INFO] [stderr] Compiling futures-util v0.3.32 [INFO] [stderr] Compiling zerofrom v0.1.6 [INFO] [stderr] Compiling yoke v0.8.1 [INFO] [stderr] Compiling tracing v0.1.44 [INFO] [stderr] Compiling zerovec v0.11.5 [INFO] [stderr] Compiling zerotrie v0.2.3 [INFO] [stderr] Compiling darling_macro v0.23.0 [INFO] [stderr] Compiling axum-core v0.5.6 [INFO] [stderr] Compiling tracing-subscriber v0.3.22 [INFO] [stderr] Compiling clap v4.5.60 [INFO] [stderr] Compiling darling v0.23.0 [INFO] [stderr] Compiling rmcp-macros v0.16.0 [INFO] [stderr] Compiling tinystr v0.8.2 [INFO] [stderr] Compiling potential_utf v0.1.4 [INFO] [stderr] Compiling icu_collections v2.1.1 [INFO] [stderr] Compiling icu_locale_core v2.1.1 [INFO] [stderr] Compiling icu_provider v2.1.1 [INFO] [stderr] Compiling icu_normalizer v2.1.1 [INFO] [stderr] Compiling icu_properties v2.1.2 [INFO] [stderr] Compiling chrono v0.4.43 [INFO] [stderr] Compiling serde_urlencoded v0.7.1 [INFO] [stderr] Compiling futures-executor v0.3.32 [INFO] [stderr] Compiling sse-stream v0.2.1 [INFO] [stderr] Compiling futures v0.3.32 [INFO] [stderr] Compiling idna_adapter v1.2.1 [INFO] [stderr] Compiling idna v1.1.0 [INFO] [stderr] Compiling schemars v1.2.1 [INFO] [stderr] Compiling url v2.5.8 [INFO] [stderr] Compiling tokio-util v0.7.18 [INFO] [stderr] Compiling tower v0.5.3 [INFO] [stderr] Compiling tokio-native-tls v0.3.1 [INFO] [stderr] Compiling tokio-stream v0.1.18 [INFO] [stderr] Compiling process-wrap v9.0.1 [INFO] [stderr] Compiling h2 v0.4.13 [INFO] [stderr] Compiling tower-http v0.6.8 [INFO] [stderr] Compiling hyper v1.8.1 [INFO] [stderr] Compiling hyper-util v0.1.20 [INFO] [stderr] Compiling hyper-tls v0.6.0 [INFO] [stderr] Compiling axum v0.8.8 [INFO] [stderr] Compiling reqwest v0.12.28 [INFO] [stderr] Compiling hevy-mcp v0.1.3 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 36s [INFO] running `Command { std: "docker" "inspect" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stderr] Compiling aho-corasick v1.1.4 [INFO] [stderr] Compiling regex-syntax v0.8.9 [INFO] [stderr] Compiling hyper v1.8.1 [INFO] [stderr] Compiling num_cpus v1.17.0 [INFO] [stderr] Compiling deadpool-runtime v0.1.4 [INFO] [stderr] Compiling assert-json-diff v2.0.2 [INFO] [stderr] Compiling deadpool v0.12.3 [INFO] [stderr] Compiling hyper-util v0.1.20 [INFO] [stderr] Compiling regex-automata v0.4.14 [INFO] [stderr] Compiling hyper-tls v0.6.0 [INFO] [stderr] Compiling axum v0.8.8 [INFO] [stderr] Compiling reqwest v0.12.28 [INFO] [stderr] Compiling matchers v0.2.0 [INFO] [stderr] Compiling regex v1.12.3 [INFO] [stderr] Compiling tracing-subscriber v0.3.22 [INFO] [stderr] Compiling wiremock v0.6.5 [INFO] [stderr] Compiling hevy-mcp v0.1.3 (/opt/rustwide/workdir) [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 37.49s [INFO] running `Command { std: "docker" "inspect" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "test" "--frozen", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.56s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/hevy_mcp-f1e522c16b8011fa) [INFO] [stdout] [INFO] [stdout] running 2 tests [INFO] [stdout] test tools::tests::test_tool_schemas ... ok [INFO] [stdout] test tools::tests::test_tools_list_count ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/client_test.rs (/opt/rustwide/target/debug/deps/client_test-c51b95286617a5fe) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/hevy-cli.rs (/opt/rustwide/target/debug/deps/hevy_cli-6f00f58ac79f1c97) [INFO] [stderr] Running unittests src/main.rs (/opt/rustwide/target/debug/deps/hevy_mcp-7d3c379545c20262) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s [INFO] [stdout] [INFO] [stderr] Running unittests src/bin/test_tools.rs (/opt/rustwide/target/debug/deps/test_tools-a4f224d7b6ece7a7) [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] [stderr] Running tests/cli_test.rs (/opt/rustwide/target/debug/deps/cli_test-4b26fea1f3b8e921) [INFO] [stdout] [INFO] [stdout] running 3 tests [INFO] [stdout] test test_cli_exports_preserve_full_notes ... ok [INFO] [stdout] test test_cli_write_commands_require_confirm_and_wrap_payloads ... ok [INFO] [stdout] test test_cli_read_commands_emit_json ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.98s [INFO] [stdout] [INFO] [stderr] Running tests/client_test.rs (/opt/rustwide/target/debug/deps/client_test-7cf20084d1b8a48e) [INFO] [stdout] [INFO] [stdout] running 2 tests [INFO] [stdout] test test_client_error_handling ... ok [INFO] [stdout] test test_client_get_workouts ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.13s [INFO] [stdout] [INFO] [stderr] Running tests/deserialize_test.rs (/opt/rustwide/target/debug/deps/deserialize_test-a4d104f52465cdc3) [INFO] [stdout] [INFO] [stdout] running 3 tests [INFO] [stdout] test test_deserialize_exercise_template ... ok [INFO] [stdout] test test_deserialize_workout ... ok [INFO] [stdout] test test_deserialize_routine ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s [INFO] [stdout] [INFO] [stderr] Running tests/integration_test.rs (/opt/rustwide/target/debug/deps/integration_test-6c8c69de39183778) [INFO] [stdout] [INFO] [stdout] running 3 tests [INFO] [stderr] 2026-07-08T23:21:26.427077Z  INFO hevy_mcp: Starting Hevy MCP server (transport=streamable-http) [INFO] [stderr] 2026-07-08T23:21:26.506454Z  INFO hevy_mcp: Starting streamable HTTP transport with CORS enabled port=42683 [INFO] [stdout] 2026-07-08T23:21:26.506833Z  INFO serve_inner: rmcp::service: Service initialized as client peer_info=Some(InitializeResult { protocol_version: ProtocolVersion("2025-03-26"), capabilities: ServerCapabilities { experimental: None, extensions: None, logging: None, completions: None, prompts: None, resources: None, tools: Some(ToolsCapability { list_changed: None }), tasks: None }, server_info: Implementation { name: "hevy-mcp", title: None, version: "0.1.3", description: None, icons: None, website_url: None }, instructions: None }) [INFO] [stdout] 2026-07-08T23:21:26.661057Z DEBUG reqwest::connect: starting new connection: http://127.0.0.1:36991/ [INFO] [stdout] 2026-07-08T23:21:26.661245Z DEBUG hyper_util::client::legacy::connect::http: connecting to 127.0.0.1:36991 [INFO] [stdout] 2026-07-08T23:21:26.661244Z DEBUG reqwest::connect: starting new connection: http://127.0.0.1:42683/ [INFO] [stdout] 2026-07-08T23:21:26.661332Z DEBUG hyper_util::client::legacy::connect::http: connecting to 127.0.0.1:42683 [INFO] [stdout] 2026-07-08T23:21:26.661513Z DEBUG hyper_util::client::legacy::connect::http: connected to 127.0.0.1:36991 [INFO] [stdout] 2026-07-08T23:21:26.661513Z DEBUG hyper_util::client::legacy::connect::http: connected to 127.0.0.1:42683 [INFO] [stdout] 2026-07-08T23:21:26.662749Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("http", 127.0.0.1:36991) [INFO] [stderr] 2026-07-08T23:21:26.662775Z  INFO rmcp::transport::streamable_http_server::session::local: create new session session_id="a30f4121-1c16-4ae2-bbf0-f597fdc89e61" [INFO] [stderr] 2026-07-08T23:21:26.674375Z DEBUG streamable_http_session{id="a30f4121-1c16-4ae2-bbf0-f597fdc89e61"}: rmcp::transport::streamable_http_server::session::local: establish new request wise channel http_request_id=0 [INFO] [stdout] 2026-07-08T23:21:26.668971Z DEBUG reqwest::connect: starting new connection: http://127.0.0.1:42683/ [INFO] [stdout] 2026-07-08T23:21:26.671007Z DEBUG hyper_util::client::legacy::connect::http: connecting to 127.0.0.1:42683 [INFO] [stdout] 2026-07-08T23:21:26.671553Z DEBUG hyper_util::client::legacy::pool: reuse idle connection for ("http", 127.0.0.1:42683) [INFO] [stdout] 2026-07-08T23:21:26.671765Z DEBUG hyper_util::client::legacy::connect::http: connected to 127.0.0.1:42683 [INFO] [stdout] test test_streamable_http_startup ... ok [INFO] [stdout] 2026-07-08T23:21:26.673040Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("http", 127.0.0.1:42683) [INFO] [stdout] 2026-07-08T23:21:26.673337Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("http", 127.0.0.1:42683) [INFO] [stdout] 2026-07-08T23:21:26.673693Z DEBUG hyper_util::client::legacy::pool: reuse idle connection for ("http", 127.0.0.1:42683) [INFO] [stderr] 2026-07-08T23:21:26.674936Z  INFO rmcp::handler::server: client initialized [INFO] [stderr] 2026-07-08T23:21:26.675066Z  INFO serve_inner: rmcp::service: Service initialized as server peer_info=Some(InitializeRequestParams { meta: None, protocol_version: ProtocolVersion("2024-11-05"), capabilities: ClientCapabilities { experimental: None, extensions: None, roots: None, sampling: None, elicitation: None, tasks: None }, client_info: Implementation { name: "test-client", title: None, version: "1.0.0", description: None, icons: None, website_url: None } }) [INFO] [stderr] 2026-07-08T23:21:26.675212Z DEBUG serve_inner: rmcp::service: received request id=2 request=ListToolsRequest(RequestOptionalParam { method: ListToolsRequestMethod, params: Some(PaginatedRequestParams { meta: None, cursor: None }), extensions: Extensions }) [INFO] [stderr] 2026-07-08T23:21:26.675410Z DEBUG serve_inner: rmcp::service: response message id=2 result=ListToolsResult(ListToolsResult { meta: None, next_cursor: None, tools: [Tool { name: "create-exercise-template", title: None, description: Some("Create a custom exercise template with title, type, equipment, and muscle groups."), input_schema: {"$defs": Object {"EquipmentCategory": Object {"description": String("Equipment category enum — matches reference TS `z.enum([...])` exactly"), "enum": Array [String("none"), String("barbell"), String("dumbbell"), String("kettlebell"), String("machine"), String("plate"), String("resistance_band"), String("suspension"), String("other")], "type": String("string")}, "ExerciseType": Object {"description": String("Exercise type enum — matches reference TS `z.enum([...])` exactly"), "enum": Array [String("weight_reps"), String("reps_only"), String("bodyweight_reps"), String("bodyweight_assisted_reps"), String("duration"), String("weight_duration"), String("distance_duration"), String("short_distance_weight")], "type": String("string")}, "MuscleGroup": Object {"description": String("Muscle group enum — matches reference TS `z.enum([...])` exactly"), "enum": Array [String("abdominals"), String("shoulders"), String("biceps"), String("triceps"), String("forearms"), String("quadriceps"), String("hamstrings"), String("calves"), String("glutes"), String("abductors"), String("adductors"), String("lats"), String("upper_back"), String("traps"), String("lower_back"), String("chest"), String("cardio"), String("neck"), String("full_body"), String("other")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Tool input: create a custom exercise template.\nUses typed enums so JSON Schema carries enum constraint info (matches reference TS Zod schemas)"), "properties": Object {"equipment_category": Object {"$ref": String("#/$defs/EquipmentCategory"), "description": String("Equipment category")}, "exercise_type": Object {"$ref": String("#/$defs/ExerciseType"), "description": String("Exercise type")}, "muscle_group": Object {"$ref": String("#/$defs/MuscleGroup"), "description": String("Primary muscle group")}, "other_muscles": Object {"default": Array [], "description": String("Additional secondary muscle groups"), "items": Object {"$ref": String("#/$defs/MuscleGroup")}, "type": String("array")}, "title": Object {"description": String("Exercise name / title"), "type": String("string")}}, "required": Array [String("title"), String("exercise_type"), String("equipment_category"), String("muscle_group")], "title": String("CreateExerciseTemplateParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Typed response wrapper for exercise template creation"), "properties": Object {"exercise_template": Bool(true)}, "title": String("ExerciseTemplateResponse"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "create-routine", title: None, description: Some("Create a new workout routine in your Hevy account. Requires a title and at least one exercise with sets. Optionally assign to a folder. Returns the full routine details including the new routine ID."), input_schema: {"$defs": Object {"RoutineExerciseInput": Object {"properties": Object {"exercise_template_id": Object {"type": String("string")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"items": Object {"$ref": String("#/$defs/RoutineSetInput")}, "type": String("array")}, "superset_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}}, "required": Array [String("exercise_template_id"), String("sets")], "type": String("object")}, "RoutineSetInput": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType"), "default": String("normal")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Tool input: create a new routine"), "properties": Object {"exercises": Object {"items": Object {"$ref": String("#/$defs/RoutineExerciseInput")}, "type": String("array")}, "folder_id": Object {"description": String("Optional folder ID to assign the routine to"), "format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "title": Object {"description": String("Routine title"), "type": String("string")}}, "required": Array [String("title"), String("exercises")], "title": String("CreateRoutineParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"Exercise": Object {"properties": Object {"exercise_template_id": Object {"nullable": Bool(true), "type": String("string")}, "index": Object {"format": String("int32"), "type": String("integer")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Set")}, "type": String("array")}, "supersets_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "title": Object {"type": String("string")}}, "required": Array [String("index"), String("title")], "type": String("object")}, "Set": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "required": Array [String("index"), String("type")], "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"created_at": Object {"type": String("string")}, "exercises": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Exercise")}, "type": String("array")}, "folder_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "id": Object {"type": String("string")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("updated_at"), String("created_at")], "title": String("Routine"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "create-routine-folder", title: None, description: Some("Create a new routine folder in your Hevy account. Requires a name for the folder. Returns the full folder details including the new folder ID."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Tool input: create a new routine folder"), "properties": Object {"title": Object {"description": String("Name for the new routine folder"), "type": String("string")}}, "required": Array [String("title")], "title": String("CreateFolderParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"created_at": Object {"type": String("string")}, "id": Object {"format": String("int32"), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("index"), String("title"), String("updated_at"), String("created_at")], "title": String("RoutineFolder"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "create-webhook-subscription", title: None, description: Some("Create a new webhook subscription for this account. The webhook will receive POST requests when workouts are created. Your endpoint must respond with 200 OK within 5 seconds."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Tool input: create a new webhook subscription"), "properties": Object {"url": Object {"description": String("The HTTPS URL that will receive POST requests for workout events"), "type": String("string")}}, "required": Array [String("url")], "title": String("CreateWebhookParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Typed response wrapper for webhook subscription"), "properties": Object {"webhook": Bool(true)}, "title": String("WebhookResponse"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "create-workout", title: None, description: Some("Create a new workout in your Hevy account. Requires title, start/end times, and at least one exercise with sets. Returns the complete workout details upon successful creation including the newly assigned workout ID."), input_schema: {"$defs": Object {"SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}, "WorkoutExerciseInput": Object {"properties": Object {"exercise_template_id": Object {"type": String("string")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"items": Object {"$ref": String("#/$defs/WorkoutSetInput")}, "type": String("array")}, "superset_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}}, "required": Array [String("exercise_template_id"), String("sets")], "type": String("object")}, "WorkoutInput": Object {"description": String("Input types for typed parameters"), "properties": Object {"description": Object {"nullable": Bool(true), "type": String("string")}, "end_time": Object {"description": String("ISO 8601 datetime (e.g. 2024-08-14T12:30:00Z)"), "type": String("string")}, "exercises": Object {"items": Object {"$ref": String("#/$defs/WorkoutExerciseInput")}, "type": String("array")}, "is_private": Object {"default": Bool(false), "type": String("boolean")}, "start_time": Object {"description": String("ISO 8601 datetime (e.g. 2024-08-14T12:00:00Z)"), "type": String("string")}, "title": Object {"description": String("Workout title"), "type": String("string")}}, "required": Array [String("title"), String("start_time"), String("end_time"), String("exercises")], "type": String("object")}, "WorkoutSetInput": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType"), "default": String("normal")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "type": String("object")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Tool input: create a new workout (typed, no opaque serde_json::Value)"), "properties": Object {"workout": Object {"$ref": String("#/$defs/WorkoutInput")}}, "required": Array [String("workout")], "title": String("CreateWorkoutParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"Exercise": Object {"properties": Object {"exercise_template_id": Object {"nullable": Bool(true), "type": String("string")}, "index": Object {"format": String("int32"), "type": String("integer")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Set")}, "type": String("array")}, "supersets_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "title": Object {"type": String("string")}}, "required": Array [String("index"), String("title")], "type": String("object")}, "Set": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "required": Array [String("index"), String("type")], "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"created_at": Object {"type": String("string")}, "description": Object {"nullable": Bool(true), "type": String("string")}, "end_time": Object {"type": String("string")}, "exercises": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Exercise")}, "type": String("array")}, "id": Object {"type": String("string")}, "routine_id": Object {"nullable": Bool(true), "type": String("string")}, "start_time": Object {"type": String("string")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("start_time"), String("end_time"), String("updated_at"), String("created_at")], "title": String("Workout"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "delete-webhook-subscription", title: None, description: Some("Delete the current webhook subscription for this account. This will stop all webhook notifications."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "title": String("EmptyParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"status": Object {"type": String("string")}}, "required": Array [String("status")], "title": String("SuccessResponse"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-exercise-history", title: None, description: Some("Get past sets for a specific exercise template, optionally filtered by start and end dates. Returns workout context and set details for each historical entry."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Tool input: get exercise history for a specific template, with optional date range"), "properties": Object {"end_date": Object {"description": String("ISO 8601 end date for filtering (optional, e.g. 2024-12-31)"), "nullable": Bool(true), "type": String("string")}, "exercise_template_id": Object {"description": String("The exercise template ID to get history for"), "type": String("string")}, "start_date": Object {"description": String("ISO 8601 start date for filtering (optional, e.g. 2024-01-01)"), "nullable": Bool(true), "type": String("string")}}, "required": Array [String("exercise_template_id")], "title": String("GetExerciseHistoryParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Typed response wrapper for exercise history (avoids serde_json::Value schema issues)"), "properties": Object {"exercise_history": Object {"items": Bool(true), "type": String("array")}, "page": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "page_count": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}}, "required": Array [String("exercise_history")], "title": String("ExerciseHistoryResponse"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-exercise-template", title: None, description: Some("Get complete details of a specific exercise template by its ID, including name, category, equipment, muscle groups, and notes."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"id": Object {"description": String("The unique exercise template ID"), "type": String("string")}}, "required": Array [String("id")], "title": String("GetTemplateParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"id": Object {"type": String("string")}, "is_custom": Object {"type": String("boolean")}, "primary_muscle_group": Object {"type": String("string")}, "secondary_muscle_groups": Object {"default": Array [], "items": Object {"type": String("string")}, "type": String("array")}, "title": Object {"type": String("string")}, "type": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("type"), String("primary_muscle_group"), String("is_custom")], "title": String("ExerciseTemplate"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-exercise-templates", title: None, description: Some("Get a paginated list of exercise templates (default and custom) with details like name, category, equipment, and muscle groups. page_size must be between 1 and 100. Useful for browsing or searching available exercises."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"page": Object {"description": String("Page number (1-indexed)"), "format": String("uint32"), "minimum": Number(1), "type": String("integer")}, "page_size": Object {"description": String("Number of results per page (must be between 1 and 100)"), "format": String("uint32"), "maximum": Number(100), "minimum": Number(1), "type": String("integer")}}, "required": Array [String("page"), String("page_size")], "title": String("TemplatePaginationParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"ExerciseTemplate": Object {"properties": Object {"id": Object {"type": String("string")}, "is_custom": Object {"type": String("boolean")}, "primary_muscle_group": Object {"type": String("string")}, "secondary_muscle_groups": Object {"default": Array [], "items": Object {"type": String("string")}, "type": String("array")}, "title": Object {"type": String("string")}, "type": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("type"), String("primary_muscle_group"), String("is_custom")], "type": String("object")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Renamed field `exercise_templates` to match actual Hevy API response key."), "properties": Object {"exercise_templates": Object {"items": Object {"$ref": String("#/$defs/ExerciseTemplate")}, "type": String("array")}, "page": Object {"format": String("int32"), "type": String("integer")}, "page_count": Object {"format": String("int32"), "type": String("integer")}}, "required": Array [String("page"), String("page_count"), String("exercise_templates")], "title": String("TemplateListSchema"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-routine", title: None, description: Some("Get a routine by its ID using the direct endpoint. Returns all details for the specified routine."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"id": Object {"description": String("The unique routine ID"), "type": String("string")}}, "required": Array [String("id")], "title": String("GetRoutineParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"Exercise": Object {"properties": Object {"exercise_template_id": Object {"nullable": Bool(true), "type": String("string")}, "index": Object {"format": String("int32"), "type": String("integer")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Set")}, "type": String("array")}, "supersets_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "title": Object {"type": String("string")}}, "required": Array [String("index"), String("title")], "type": String("object")}, "Set": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "required": Array [String("index"), String("type")], "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"created_at": Object {"type": String("string")}, "exercises": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Exercise")}, "type": String("array")}, "folder_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "id": Object {"type": String("string")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("updated_at"), String("created_at")], "title": String("Routine"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-routine-folder", title: None, description: Some("Get complete details of a specific routine folder by its ID, including name, creation date, and associated routines."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Tool input: fetch a single routine folder by ID"), "properties": Object {"id": Object {"description": String("The unique routine folder ID"), "type": String("string")}}, "required": Array [String("id")], "title": String("GetFolderParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"created_at": Object {"type": String("string")}, "id": Object {"format": String("int32"), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("index"), String("title"), String("updated_at"), String("created_at")], "title": String("RoutineFolder"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-routine-folders", title: None, description: Some("Get a paginated list of your routine folders, including both default and custom folders. page_size must be between 1 and 10. Useful for organizing and browsing your workout routines."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"page": Object {"description": String("Page number (1-indexed)"), "format": String("uint32"), "minimum": Number(1), "type": String("integer")}, "page_size": Object {"description": String("Number of results per page (must be between 1 and 10)"), "format": String("uint32"), "maximum": Number(10), "minimum": Number(1), "type": String("integer")}}, "required": Array [String("page"), String("page_size")], "title": String("PaginationParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"RoutineFolder": Object {"properties": Object {"created_at": Object {"type": String("string")}, "id": Object {"format": String("int32"), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("index"), String("title"), String("updated_at"), String("created_at")], "type": String("object")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Renamed field `routine_folders` to match actual Hevy API response key."), "properties": Object {"page": Object {"format": String("int32"), "type": String("integer")}, "page_count": Object {"format": String("int32"), "type": String("integer")}, "routine_folders": Object {"items": Object {"$ref": String("#/$defs/RoutineFolder")}, "type": String("array")}}, "required": Array [String("page"), String("page_count"), String("routine_folders")], "title": String("FolderListSchema"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-routines", title: None, description: Some("Get a paginated list of your workout routines, including custom and default routines. page_size must be between 1 and 10. Useful for browsing or searching your available routines."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"page": Object {"description": String("Page number (1-indexed)"), "format": String("uint32"), "minimum": Number(1), "type": String("integer")}, "page_size": Object {"description": String("Number of results per page (must be between 1 and 10)"), "format": String("uint32"), "maximum": Number(10), "minimum": Number(1), "type": String("integer")}}, "required": Array [String("page"), String("page_size")], "title": String("PaginationParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"Exercise": Object {"properties": Object {"exercise_template_id": Object {"nullable": Bool(true), "type": String("string")}, "index": Object {"format": String("int32"), "type": String("integer")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Set")}, "type": String("array")}, "supersets_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "title": Object {"type": String("string")}}, "required": Array [String("index"), String("title")], "type": String("object")}, "Routine": Object {"properties": Object {"created_at": Object {"type": String("string")}, "exercises": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Exercise")}, "type": String("array")}, "folder_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "id": Object {"type": String("string")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("updated_at"), String("created_at")], "type": String("object")}, "Set": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "required": Array [String("index"), String("type")], "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"page": Object {"format": String("int32"), "type": String("integer")}, "page_count": Object {"format": String("int32"), "type": String("integer")}, "routines": Object {"items": Object {"$ref": String("#/$defs/Routine")}, "type": String("array")}}, "required": Array [String("page"), String("page_count"), String("routines")], "title": String("RoutineListSchema"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-webhook-subscription", title: None, description: Some("Get the current webhook subscription for this account. Returns the webhook URL and auth token if a subscription exists."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "title": String("EmptyParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Typed response wrapper for webhook subscription"), "properties": Object {"webhook": Bool(true)}, "title": String("WebhookResponse"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-workout", title: None, description: Some("Get complete details of a specific workout by ID. Returns all workout information including title, description, start/end times, and detailed exercise data."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"id": Object {"description": String("The unique workout ID"), "type": String("string")}}, "required": Array [String("id")], "title": String("GetWorkoutParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"Exercise": Object {"properties": Object {"exercise_template_id": Object {"nullable": Bool(true), "type": String("string")}, "index": Object {"format": String("int32"), "type": String("integer")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Set")}, "type": String("array")}, "supersets_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "title": Object {"type": String("string")}}, "required": Array [String("index"), String("title")], "type": String("object")}, "Set": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "required": Array [String("index"), String("type")], "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"created_at": Object {"type": String("string")}, "description": Object {"nullable": Bool(true), "type": String("string")}, "end_time": Object {"type": String("string")}, "exercises": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Exercise")}, "type": String("array")}, "id": Object {"type": String("string")}, "routine_id": Object {"nullable": Bool(true), "type": String("string")}, "start_time": Object {"type": String("string")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("start_time"), String("end_time"), String("updated_at"), String("created_at")], "title": String("Workout"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-workout-count", title: None, description: Some("Get the total number of workouts on the account. Useful for pagination or statistics."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "title": String("EmptyParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"count": Object {"format": String("uint32"), "minimum": Number(0), "type": String("integer")}}, "required": Array [String("count")], "title": String("WorkoutCountResponse"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-workout-events", title: None, description: Some("Retrieve a paged list of workout events (updates or deletes) since a given date. Events are ordered from newest to oldest. page_size must be between 1 and 10. The intention is to allow clients to keep their local cache of workouts up to date without having to fetch the entire list of workouts."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"page": Object {"description": String("Page number (1-indexed)"), "format": String("uint32"), "minimum": Number(1), "type": String("integer")}, "page_size": Object {"description": String("Number of results per page (must be between 1 and 10)"), "format": String("uint32"), "maximum": Number(10), "minimum": Number(1), "type": String("integer")}, "since": Object {"description": String("ISO 8601 date-time; only events after this timestamp are returned"), "type": String("string")}}, "required": Array [String("page"), String("page_size"), String("since")], "title": String("GetEventsParams"), "type": String("object")}, output_schema: Some({"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"events": Object {"items": Bool(true), "type": String("array")}, "page": Object {"format": String("uint32"), "minimum": Number(0), "type": String("integer")}, "page_count": Object {"format": String("uint32"), "minimum": Number(0), "type": String("integer")}}, "required": Array [String("page"), String("page_count"), String("events")], "title": String("PaginatedWorkoutEvents"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "get-workouts", title: None, description: Some("Get a paginated list of workouts. Returns workout details including title, description, start/end times, and exercises performed. Results are ordered from newest to oldest (most recent first). page_size must be between 1 and 10. To fetch recent workouts, use page=1 and a small page_size (e.g. 5), then filter the results by date."), input_schema: {"$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"page": Object {"description": String("Page number (1-indexed)"), "format": String("uint32"), "minimum": Number(1), "type": String("integer")}, "page_size": Object {"description": String("Number of results per page (must be between 1 and 10)"), "format": String("uint32"), "maximum": Number(10), "minimum": Number(1), "type": String("integer")}}, "required": Array [String("page"), String("page_size")], "title": String("PaginationParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"Exercise": Object {"properties": Object {"exercise_template_id": Object {"nullable": Bool(true), "type": String("string")}, "index": Object {"format": String("int32"), "type": String("integer")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Set")}, "type": String("array")}, "supersets_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "title": Object {"type": String("string")}}, "required": Array [String("index"), String("title")], "type": String("object")}, "Set": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "required": Array [String("index"), String("type")], "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}, "Workout": Object {"properties": Object {"created_at": Object {"type": String("string")}, "description": Object {"nullable": Bool(true), "type": String("string")}, "end_time": Object {"type": String("string")}, "exercises": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Exercise")}, "type": String("array")}, "id": Object {"type": String("string")}, "routine_id": Object {"nullable": Bool(true), "type": String("string")}, "start_time": Object {"type": String("string")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("start_time"), String("end_time"), String("updated_at"), String("created_at")], "type": String("object")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"page": Object {"format": String("int32"), "type": String("integer")}, "page_count": Object {"format": String("int32"), "type": String("integer")}, "workouts": Object {"items": Object {"$ref": String("#/$defs/Workout")}, "type": String("array")}}, "required": Array [String("page"), String("page_count"), String("workouts")], "title": String("WorkoutListSchema"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "update-routine", title: None, description: Some("Update an existing routine by ID. You can modify the title, notes, and exercise configurations. Returns the updated routine with all changes applied."), input_schema: {"$defs": Object {"RoutineExerciseInput": Object {"properties": Object {"exercise_template_id": Object {"type": String("string")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"items": Object {"$ref": String("#/$defs/RoutineSetInput")}, "type": String("array")}, "superset_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}}, "required": Array [String("exercise_template_id"), String("sets")], "type": String("object")}, "RoutineSetInput": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType"), "default": String("normal")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Tool input: update an existing routine"), "properties": Object {"exercises": Object {"items": Object {"$ref": String("#/$defs/RoutineExerciseInput")}, "type": String("array")}, "folder_id": Object {"description": String("Optional folder ID to assign the routine to"), "format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "id": Object {"description": String("The unique routine ID to update"), "type": String("string")}, "title": Object {"description": String("Routine title"), "type": String("string")}}, "required": Array [String("id"), String("title"), String("exercises")], "title": String("UpdateRoutineParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"Exercise": Object {"properties": Object {"exercise_template_id": Object {"nullable": Bool(true), "type": String("string")}, "index": Object {"format": String("int32"), "type": String("integer")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Set")}, "type": String("array")}, "supersets_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "title": Object {"type": String("string")}}, "required": Array [String("index"), String("title")], "type": String("object")}, "Set": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "required": Array [String("index"), String("type")], "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"created_at": Object {"type": String("string")}, "exercises": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Exercise")}, "type": String("array")}, "folder_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "id": Object {"type": String("string")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("updated_at"), String("created_at")], "title": String("Routine"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }, Tool { name: "update-workout", title: None, description: Some("Update an existing workout by ID. You can modify the title, description, start/end times, privacy setting, and exercise data. Returns the updated workout with all changes applied."), input_schema: {"$defs": Object {"SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}, "WorkoutExerciseInput": Object {"properties": Object {"exercise_template_id": Object {"type": String("string")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"items": Object {"$ref": String("#/$defs/WorkoutSetInput")}, "type": String("array")}, "superset_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}}, "required": Array [String("exercise_template_id"), String("sets")], "type": String("object")}, "WorkoutInput": Object {"description": String("Input types for typed parameters"), "properties": Object {"description": Object {"nullable": Bool(true), "type": String("string")}, "end_time": Object {"description": String("ISO 8601 datetime (e.g. 2024-08-14T12:30:00Z)"), "type": String("string")}, "exercises": Object {"items": Object {"$ref": String("#/$defs/WorkoutExerciseInput")}, "type": String("array")}, "is_private": Object {"default": Bool(false), "type": String("boolean")}, "start_time": Object {"description": String("ISO 8601 datetime (e.g. 2024-08-14T12:00:00Z)"), "type": String("string")}, "title": Object {"description": String("Workout title"), "type": String("string")}}, "required": Array [String("title"), String("start_time"), String("end_time"), String("exercises")], "type": String("object")}, "WorkoutSetInput": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType"), "default": String("normal")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "type": String("object")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "description": String("Tool input: update an existing workout"), "properties": Object {"id": Object {"description": String("The unique workout ID to update"), "type": String("string")}, "workout": Object {"$ref": String("#/$defs/WorkoutInput")}}, "required": Array [String("id"), String("workout")], "title": String("UpdateWorkoutParams"), "type": String("object")}, output_schema: Some({"$defs": Object {"Exercise": Object {"properties": Object {"exercise_template_id": Object {"nullable": Bool(true), "type": String("string")}, "index": Object {"format": String("int32"), "type": String("integer")}, "notes": Object {"nullable": Bool(true), "type": String("string")}, "sets": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Set")}, "type": String("array")}, "supersets_id": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "title": Object {"type": String("string")}}, "required": Array [String("index"), String("title")], "type": String("object")}, "Set": Object {"properties": Object {"custom_metric": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "distance_meters": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "duration_seconds": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "index": Object {"format": String("int32"), "type": String("integer")}, "reps": Object {"format": String("int32"), "nullable": Bool(true), "type": String("integer")}, "rpe": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}, "type": Object {"$ref": String("#/$defs/SetType")}, "weight_kg": Object {"format": String("double"), "nullable": Bool(true), "type": String("number")}}, "required": Array [String("index"), String("type")], "type": String("object")}, "SetType": Object {"enum": Array [String("warmup"), String("normal"), String("failure"), String("dropset")], "type": String("string")}}, "$schema": String("https://json-schema.org/draft/2020-12/schema"), "properties": Object {"created_at": Object {"type": String("string")}, "description": Object {"nullable": Bool(true), "type": String("string")}, "end_time": Object {"type": String("string")}, "exercises": Object {"default": Array [], "items": Object {"$ref": String("#/$defs/Exercise")}, "type": String("array")}, "id": Object {"type": String("string")}, "routine_id": Object {"nullable": Bool(true), "type": String("string")}, "start_time": Object {"type": String("string")}, "title": Object {"type": String("string")}, "updated_at": Object {"type": String("string")}}, "required": Array [String("id"), String("title"), String("start_time"), String("end_time"), String("updated_at"), String("created_at")], "title": String("Workout"), "type": String("object")}), annotations: None, execution: None, icons: None, meta: None }] }) [INFO] [stderr] 2026-07-08T23:21:26.677971Z DEBUG streamable_http_session{id="a30f4121-1c16-4ae2-bbf0-f597fdc89e61"}: rmcp::transport::streamable_http_server::session::local: close http request wise channel http_request_id=0 [INFO] [stdout] 2026-07-08T23:21:26.681857Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("http", 127.0.0.1:42683) [INFO] [stdout] 2026-07-08T23:21:26.683032Z DEBUG hyper_util::client::legacy::pool: reuse idle connection for ("http", 127.0.0.1:42683) [INFO] [stderr] 2026-07-08T23:21:26.684231Z DEBUG streamable_http_session{id="a30f4121-1c16-4ae2-bbf0-f597fdc89e61"}: rmcp::transport::streamable_http_server::session::local: establish new request wise channel http_request_id=1 [INFO] [stderr] 2026-07-08T23:21:26.685293Z DEBUG serve_inner: rmcp::service: received request id=3 request=CallToolRequest(Request { method: CallToolRequestMethod, params: CallToolRequestParams { meta: None, name: "get-workout-count", arguments: Some({}), task: None }, extensions: Extensions }) [INFO] [stderr] 2026-07-08T23:21:26.685883Z DEBUG serve_inner:get_workout_count: reqwest::connect: starting new connection: http://127.0.0.1:42727/ [INFO] [stderr] 2026-07-08T23:21:26.686054Z DEBUG serve_inner:get_workout_count: hyper_util::client::legacy::connect::http: connecting to 127.0.0.1:42727 [INFO] [stderr] 2026-07-08T23:21:26.686334Z DEBUG serve_inner:get_workout_count: hyper_util::client::legacy::connect::http: connected to 127.0.0.1:42727 [INFO] [stdout] 2026-07-08T23:21:26.687226Z DEBUG wiremock::mock_set: Handling request. [INFO] [stderr] 2026-07-08T23:21:26.687686Z DEBUG serve_inner:get_workout_count: hyper_util::client::legacy::pool: pooling idle connection for ("http", 127.0.0.1:42727) [INFO] [stderr] 2026-07-08T23:21:26.688149Z DEBUG serve_inner: rmcp::service: response message id=3 result=CallToolResult(CallToolResult { content: [Annotated { raw: Text(RawTextContent { text: "{\"count\":12}", meta: None }), annotations: None }], structured_content: Some(Object {"count": Number(12)}), is_error: Some(false), meta: None }) [INFO] [stderr] 2026-07-08T23:21:26.688509Z DEBUG streamable_http_session{id="a30f4121-1c16-4ae2-bbf0-f597fdc89e61"}: rmcp::transport::streamable_http_server::session::local: close http request wise channel http_request_id=1 [INFO] [stdout] 2026-07-08T23:21:26.726662Z DEBUG hyper_util::client::legacy::pool: pooling idle connection for ("http", 127.0.0.1:42683) [INFO] [stdout] 2026-07-08T23:21:26.729073Z DEBUG hyper_util::client::legacy::client: client connection error: hyper::Error(IncompleteMessage) [INFO] [stdout] 2026-07-08T23:21:26.730703Z DEBUG wiremock::mock_server::exposed_server: Verify mock expectations. [INFO] [stdout] test test_streamable_mcp_full_listing ... ok [INFO] [stdout] 2026-07-08T23:21:27.032461Z DEBUG wiremock::mock_set: Handling request. [INFO] [stdout] 2026-07-08T23:21:27.034237Z  INFO serve_inner: rmcp::service: task cancelled [INFO] [stdout] 2026-07-08T23:21:27.055036Z  INFO serve_inner: rmcp::transport::child_process: Child exited gracefully exit status: 0 [INFO] [stdout] 2026-07-08T23:21:27.055184Z  INFO serve_inner: rmcp::service: serve finished quit_reason=Cancelled [INFO] [stdout] 2026-07-08T23:21:27.055412Z DEBUG wiremock::mock_server::exposed_server: Verify mock expectations. [INFO] [stdout] test test_full_mcp_client ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.64s [INFO] [stdout] [INFO] [stderr] Doc-tests hevy_mcp [INFO] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c", kill_on_drop: false }` [INFO] [stdout] 92ef242fa439355306358aa6b3a03aaa08848be756f0a30bdab9afa54fc2b54c