[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] [2m2026-07-08T23:21:26.427077Z[0m [32m INFO[0m [2mhevy_mcp[0m[2m:[0m Starting Hevy MCP server (transport=streamable-http)
[INFO] [stderr] [2m2026-07-08T23:21:26.506454Z[0m [32m INFO[0m [2mhevy_mcp[0m[2m:[0m Starting streamable HTTP transport with CORS enabled [3mport[0m[2m=[0m42683
[INFO] [stdout] [2m2026-07-08T23:21:26.506833Z[0m [32m INFO[0m [1mserve_inner[0m[2m:[0m [2mrmcp::service[0m[2m:[0m Service initialized as client [3mpeer_info[0m[2m=[0mSome(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] [2m2026-07-08T23:21:26.661057Z[0m [34mDEBUG[0m [2mreqwest::connect[0m[2m:[0m starting new connection: http://127.0.0.1:36991/
[INFO] [stdout] [2m2026-07-08T23:21:26.661245Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::connect::http[0m[2m:[0m connecting to 127.0.0.1:36991
[INFO] [stdout] [2m2026-07-08T23:21:26.661244Z[0m [34mDEBUG[0m [2mreqwest::connect[0m[2m:[0m starting new connection: http://127.0.0.1:42683/
[INFO] [stdout] [2m2026-07-08T23:21:26.661332Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::connect::http[0m[2m:[0m connecting to 127.0.0.1:42683
[INFO] [stdout] [2m2026-07-08T23:21:26.661513Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::connect::http[0m[2m:[0m connected to 127.0.0.1:36991
[INFO] [stdout] [2m2026-07-08T23:21:26.661513Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::connect::http[0m[2m:[0m connected to 127.0.0.1:42683
[INFO] [stdout] [2m2026-07-08T23:21:26.662749Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::pool[0m[2m:[0m pooling idle connection for ("http", 127.0.0.1:36991)
[INFO] [stderr] [2m2026-07-08T23:21:26.662775Z[0m [32m INFO[0m [2mrmcp::transport::streamable_http_server::session::local[0m[2m:[0m create new session [3msession_id[0m[2m=[0m"a30f4121-1c16-4ae2-bbf0-f597fdc89e61"
[INFO] [stderr] [2m2026-07-08T23:21:26.674375Z[0m [34mDEBUG[0m [1mstreamable_http_session[0m[1m{[0m[3mid[0m[2m=[0m"a30f4121-1c16-4ae2-bbf0-f597fdc89e61"[1m}[0m[2m:[0m [2mrmcp::transport::streamable_http_server::session::local[0m[2m:[0m establish new request wise channel [3mhttp_request_id[0m[2m=[0m0
[INFO] [stdout] [2m2026-07-08T23:21:26.668971Z[0m [34mDEBUG[0m [2mreqwest::connect[0m[2m:[0m starting new connection: http://127.0.0.1:42683/
[INFO] [stdout] [2m2026-07-08T23:21:26.671007Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::connect::http[0m[2m:[0m connecting to 127.0.0.1:42683
[INFO] [stdout] [2m2026-07-08T23:21:26.671553Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::pool[0m[2m:[0m reuse idle connection for ("http", 127.0.0.1:42683)
[INFO] [stdout] [2m2026-07-08T23:21:26.671765Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::connect::http[0m[2m:[0m connected to 127.0.0.1:42683
[INFO] [stdout] test test_streamable_http_startup ... ok
[INFO] [stdout] [2m2026-07-08T23:21:26.673040Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::pool[0m[2m:[0m pooling idle connection for ("http", 127.0.0.1:42683)
[INFO] [stdout] [2m2026-07-08T23:21:26.673337Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::pool[0m[2m:[0m pooling idle connection for ("http", 127.0.0.1:42683)
[INFO] [stdout] [2m2026-07-08T23:21:26.673693Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::pool[0m[2m:[0m reuse idle connection for ("http", 127.0.0.1:42683)
[INFO] [stderr] [2m2026-07-08T23:21:26.674936Z[0m [32m INFO[0m [2mrmcp::handler::server[0m[2m:[0m client initialized
[INFO] [stderr] [2m2026-07-08T23:21:26.675066Z[0m [32m INFO[0m [1mserve_inner[0m[2m:[0m [2mrmcp::service[0m[2m:[0m Service initialized as server [3mpeer_info[0m[2m=[0mSome(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] [2m2026-07-08T23:21:26.675212Z[0m [34mDEBUG[0m [1mserve_inner[0m[2m:[0m [2mrmcp::service[0m[2m:[0m received request [3mid[0m[2m=[0m2 [3mrequest[0m[2m=[0mListToolsRequest(RequestOptionalParam { method: ListToolsRequestMethod, params: Some(PaginatedRequestParams { meta: None, cursor: None }), extensions: Extensions })
[INFO] [stderr] [2m2026-07-08T23:21:26.675410Z[0m [34mDEBUG[0m [1mserve_inner[0m[2m:[0m [2mrmcp::service[0m[2m:[0m response message [3mid[0m[2m=[0m2 [3mresult[0m[2m=[0mListToolsResult(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] [2m2026-07-08T23:21:26.677971Z[0m [34mDEBUG[0m [1mstreamable_http_session[0m[1m{[0m[3mid[0m[2m=[0m"a30f4121-1c16-4ae2-bbf0-f597fdc89e61"[1m}[0m[2m:[0m [2mrmcp::transport::streamable_http_server::session::local[0m[2m:[0m close http request wise channel [3mhttp_request_id[0m[2m=[0m0
[INFO] [stdout] [2m2026-07-08T23:21:26.681857Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::pool[0m[2m:[0m pooling idle connection for ("http", 127.0.0.1:42683)
[INFO] [stdout] [2m2026-07-08T23:21:26.683032Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::pool[0m[2m:[0m reuse idle connection for ("http", 127.0.0.1:42683)
[INFO] [stderr] [2m2026-07-08T23:21:26.684231Z[0m [34mDEBUG[0m [1mstreamable_http_session[0m[1m{[0m[3mid[0m[2m=[0m"a30f4121-1c16-4ae2-bbf0-f597fdc89e61"[1m}[0m[2m:[0m [2mrmcp::transport::streamable_http_server::session::local[0m[2m:[0m establish new request wise channel [3mhttp_request_id[0m[2m=[0m1
[INFO] [stderr] [2m2026-07-08T23:21:26.685293Z[0m [34mDEBUG[0m [1mserve_inner[0m[2m:[0m [2mrmcp::service[0m[2m:[0m received request [3mid[0m[2m=[0m3 [3mrequest[0m[2m=[0mCallToolRequest(Request { method: CallToolRequestMethod, params: CallToolRequestParams { meta: None, name: "get-workout-count", arguments: Some({}), task: None }, extensions: Extensions })
[INFO] [stderr] [2m2026-07-08T23:21:26.685883Z[0m [34mDEBUG[0m [1mserve_inner[0m[2m:[0m[1mget_workout_count[0m[2m:[0m [2mreqwest::connect[0m[2m:[0m starting new connection: http://127.0.0.1:42727/
[INFO] [stderr] [2m2026-07-08T23:21:26.686054Z[0m [34mDEBUG[0m [1mserve_inner[0m[2m:[0m[1mget_workout_count[0m[2m:[0m [2mhyper_util::client::legacy::connect::http[0m[2m:[0m connecting to 127.0.0.1:42727
[INFO] [stderr] [2m2026-07-08T23:21:26.686334Z[0m [34mDEBUG[0m [1mserve_inner[0m[2m:[0m[1mget_workout_count[0m[2m:[0m [2mhyper_util::client::legacy::connect::http[0m[2m:[0m connected to 127.0.0.1:42727
[INFO] [stdout] [2m2026-07-08T23:21:26.687226Z[0m [34mDEBUG[0m [2mwiremock::mock_set[0m[2m:[0m Handling request.
[INFO] [stderr] [2m2026-07-08T23:21:26.687686Z[0m [34mDEBUG[0m [1mserve_inner[0m[2m:[0m[1mget_workout_count[0m[2m:[0m [2mhyper_util::client::legacy::pool[0m[2m:[0m pooling idle connection for ("http", 127.0.0.1:42727)
[INFO] [stderr] [2m2026-07-08T23:21:26.688149Z[0m [34mDEBUG[0m [1mserve_inner[0m[2m:[0m [2mrmcp::service[0m[2m:[0m response message [3mid[0m[2m=[0m3 [3mresult[0m[2m=[0mCallToolResult(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] [2m2026-07-08T23:21:26.688509Z[0m [34mDEBUG[0m [1mstreamable_http_session[0m[1m{[0m[3mid[0m[2m=[0m"a30f4121-1c16-4ae2-bbf0-f597fdc89e61"[1m}[0m[2m:[0m [2mrmcp::transport::streamable_http_server::session::local[0m[2m:[0m close http request wise channel [3mhttp_request_id[0m[2m=[0m1
[INFO] [stdout] [2m2026-07-08T23:21:26.726662Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::pool[0m[2m:[0m pooling idle connection for ("http", 127.0.0.1:42683)
[INFO] [stdout] [2m2026-07-08T23:21:26.729073Z[0m [34mDEBUG[0m [2mhyper_util::client::legacy::client[0m[2m:[0m client connection error: hyper::Error(IncompleteMessage)
[INFO] [stdout] [2m2026-07-08T23:21:26.730703Z[0m [34mDEBUG[0m [2mwiremock::mock_server::exposed_server[0m[2m:[0m Verify mock expectations.
[INFO] [stdout] test test_streamable_mcp_full_listing ... ok
[INFO] [stdout] [2m2026-07-08T23:21:27.032461Z[0m [34mDEBUG[0m [2mwiremock::mock_set[0m[2m:[0m Handling request.
[INFO] [stdout] [2m2026-07-08T23:21:27.034237Z[0m [32m INFO[0m [1mserve_inner[0m[2m:[0m [2mrmcp::service[0m[2m:[0m task cancelled
[INFO] [stdout] [2m2026-07-08T23:21:27.055036Z[0m [32m INFO[0m [1mserve_inner[0m[2m:[0m [2mrmcp::transport::child_process[0m[2m:[0m Child exited gracefully exit status: 0
[INFO] [stdout] [2m2026-07-08T23:21:27.055184Z[0m [32m INFO[0m [1mserve_inner[0m[2m:[0m [2mrmcp::service[0m[2m:[0m serve finished [3mquit_reason[0m[2m=[0mCancelled
[INFO] [stdout] [2m2026-07-08T23:21:27.055412Z[0m [34mDEBUG[0m [2mwiremock::mock_server::exposed_server[0m[2m:[0m 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
