diff --git a/AGENT.md b/AGENT.md index ebc2d64..12b9125 100644 --- a/AGENT.md +++ b/AGENT.md @@ -23,3 +23,4 @@ - Error handling: return errors up the stack, log at top level - Package names: lowercase, descriptive (buildkite, commands, trace, tokens) - Use contexts for cancellation and tracing throughout +- Use `mcp.NewToolResultError` or `mcp.NewToolResultErrorFromErr` to handle errors in tools. \ No newline at end of file diff --git a/go.sum b/go.sum index 2d0f202..96697e6 100644 --- a/go.sum +++ b/go.sum @@ -2,14 +2,12 @@ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs= cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s= -cloud.google.com/go/auth v0.16.3 h1:kabzoQ9/bobUmnseYnBO6qQG7q4a/CffFRlJSxv2wCc= -cloud.google.com/go/auth v0.16.3/go.mod h1:NucRGjaXfzP1ltpcQ7On/VTZ0H4kWB5Jy+Y9Dnm76fA= cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI= +cloud.google.com/go/auth v0.16.5/go.mod h1:utzRfHMP+Vv0mpOkTRQoWD2q3BatTOoWbA7gCc2dUhQ= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= -cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA= +cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= @@ -34,94 +32,52 @@ github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXb github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= -github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= -github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= -github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0= -github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= github.com/aws/aws-sdk-go-v2 v1.38.1 h1:j7sc33amE74Rz0M/PoCpsZQ6OunLqys/m5antM0J+Z8= github.com/aws/aws-sdk-go-v2 v1.38.1/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg= -github.com/aws/aws-sdk-go-v2/config v1.29.17 h1:jSuiQ5jEe4SAMH6lLRMY9OVC+TqJLP5655pBGjmnjr0= -github.com/aws/aws-sdk-go-v2/config v1.29.17/go.mod h1:9P4wwACpbeXs9Pm9w1QTh6BwWwJjwYvJ1iCt5QbCXh8= github.com/aws/aws-sdk-go-v2/config v1.31.2 h1:NOaSZpVGEH2Np/c1toSeW0jooNl+9ALmsUTZ8YvkJR0= github.com/aws/aws-sdk-go-v2/config v1.31.2/go.mod h1:17ft42Yb2lF6OigqSYiDAiUcX4RIkEMY6XxEMJsrAes= -github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDOhHhaXVd72mmyv4/0= -github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc= github.com/aws/aws-sdk-go-v2/credentials v1.18.6 h1:AmmvNEYrru7sYNJnp3pf57lGbiarX4T9qU/6AZ9SucU= github.com/aws/aws-sdk-go-v2/credentials v1.18.6/go.mod h1:/jdQkh1iVPa01xndfECInp1v1Wnp70v3K4MvtlLGVEc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 h1:KAXP9JSHO1vKGCr5f4O6WmlVKLFFXgWYAGoJosorxzU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32/go.mod h1:h4Sg6FQdexC1yYG9RDnOvLbW1a/P986++/Y/a+GyEM8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.4 h1:lpdMwTzmuDLkgW7086jE94HweHCqG+uOJwHf3LZs7T0= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.4/go.mod h1:9xzb8/SV62W6gHQGC/8rrvgNXU6ZoYM3sAIJCIrXJxY= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.84 h1:cTXRdLkpBanlDwISl+5chq5ui1d1YWg4PWMR9c3kXyw= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.84/go.mod h1:kwSy5X7tfIHN39uucmjQVs2LvDdXEjQucgQQEqCggEo= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.0 h1:2FFgK3oFA8PTNBjprLFfcmkgg7U9YuSimBvR64RUmiA= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.0/go.mod h1:xdxj6nC1aU/jAO80RIlIj3fU40MOSqutEA9N2XFct04= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36/go.mod h1:Q1lnJArKRXkenyog6+Y+zr7WDpk4e6XlR6gs20bbeNo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.4 h1:IdCLsiiIj5YJ3AFevsewURCPV+YWUlOW8JiPhoAy8vg= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.4/go.mod h1:l4bdfCD7XyyZA9BolKBo1eLqgaJxl0/x91PL4Yqe0ao= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 h1:i2vNHQiXUvKhs3quBR6aqlgJaiaexz/aNvdCktW/kAM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36/go.mod h1:UdyGa7Q91id/sdyHPwth+043HhmP6yP9MBHgbZM0xo8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.4 h1:j7vjtr1YIssWQOMeOWRbh3z8g2oY/xPjnZH2gLY4sGw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.4/go.mod h1:yDmJgqOiH4EA8Hndnv4KwAo8jCGTSnM5ASG1nBI+toA= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 h1:GMYy2EOWfzdP3wfVAGXBNKY5vK4K8vMET4sYOYltmqs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36/go.mod h1:gDhdAV6wL3PmPqBhiPbnlS447GoWs8HTTOYef9/9Inw= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.4 h1:BE/MNQ86yzTINrfxPPFS86QCBNQeLKY2A0KhDh47+wI= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.4/go.mod h1:SPBBhkJxjcrzJBc+qY85e83MQ2q3qdra8fghhkkyrJg= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 h1:nAP2GYbfh8dd2zGZqFRSMlq+/F6cMPBUuCsGAMkN074= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4/go.mod h1:LT10DsiGjLWh4GbjInf9LQejkYEhBgBCjLG5+lvk4EE= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.4 h1:Beh9oVgtQnBgR4sKKzkUBRQpf1GnL4wt0l4s8h2VCJ0= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.4/go.mod h1:b17At0o8inygF+c6FOD3rNyYZufPw62o9XJbSfQPgbo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 h1:t0E6FzREdtCsiLIoLCWsYliNsRBgyGD/MCK571qk4MI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17/go.mod h1:ygpklyoaypuyDvOM5ujWGrYWpAK3h7ugnmKCU/76Ys4= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.4 h1:ueB2Te0NacDMnaC+68za9jLwkjzxGWm0KB5HTUHjLTI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.4/go.mod h1:nLEfLnVMmLvyIG58/6gsSA03F1voKGaCfHV7+lR8S7s= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 h1:qcLWgdhq45sDM9na4cvXax9dyLitn8EYBRl8Ak4XtG4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17/go.mod h1:M+jkjBFZ2J6DJrjMv2+vkBbuht6kxJYtJiwoVgX4p4U= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.4 h1:HVSeukL40rHclNcUqVcBwE1YoZhOkoLeBfhUqR3tjIU= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.4/go.mod h1:DnbBOv4FlIXHj2/xmrUQYtawRFC9L9ZmQPz+DBc6X5I= -github.com/aws/aws-sdk-go-v2/service/s3 v1.84.0 h1:0reDqfEN+tB+sozj2r92Bep8MEwBZgtAXTND1Kk9OXg= -github.com/aws/aws-sdk-go-v2/service/s3 v1.84.0/go.mod h1:kUklwasNoCn5YpyAqC/97r6dzTA1SRKJfKq16SXeoDU= github.com/aws/aws-sdk-go-v2/service/s3 v1.87.1 h1:2n6Pd67eJwAb/5KCX62/8RTU0aFAAW7V5XIGSghiHrw= github.com/aws/aws-sdk-go-v2/service/s3 v1.87.1/go.mod h1:w5PC+6GHLkvMJKasYGVloB3TduOtROEMqm15HSuIbw4= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 h1:AIRJ3lfb2w/1/8wOOSqYb9fUKGwQbtysJ2H1MofRUPg= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.5/go.mod h1:b7SiVprpU+iGazDUqvRSLf5XmCdn+JtT1on7uNL6Ipc= github.com/aws/aws-sdk-go-v2/service/sso v1.28.2 h1:ve9dYBB8CfJGTFqcQ3ZLAAb/KXWgYlgu/2R2TZL2Ko0= github.com/aws/aws-sdk-go-v2/service/sso v1.28.2/go.mod h1:n9bTZFZcBa9hGGqVz3i/a6+NG0zmZgtkB9qVVFDqPA8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 h1:BpOxT3yhLwSJ77qIY3DoHAQjZsc4HEGfMCE4NGy3uFg= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3/go.mod h1:vq/GQR1gOFLquZMSrxUK/cpvKCNVYibNyJ1m7JrU88E= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.2 h1:pd9G9HQaM6UZAZh19pYOkpKSQkyQQ9ftnl/LttQOcGI= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.2/go.mod h1:eknndR9rU8UpE/OmFpqU78V1EcXPKFTTm5l/buZYgvM= -github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0= -github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w= github.com/aws/aws-sdk-go-v2/service/sts v1.38.0 h1:iV1Ko4Em/lkJIsoKyGfc0nQySi+v0Udxr6Igq+y9JZc= github.com/aws/aws-sdk-go-v2/service/sts v1.38.0/go.mod h1:bEPcjW7IbolPfK67G1nilqWyoxYMSPrDiIQ3RdIdKgo= -github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= -github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/buildkite/buildkite-logs v0.6.0 h1:wp0B2upLG6ChjpmdEeYhHvn6rDVTIGovAFk7phLSQfU= -github.com/buildkite/buildkite-logs v0.6.0/go.mod h1:ejxwp0IDk7Wd0yTH0Cvnw8GgRGnpboe6Up4k9SGmWTg= github.com/buildkite/buildkite-logs v0.6.1 h1:5SlAsAFYKy1rl3j7GNldgeOzBMbuKYSgdFlvNnVINEs= github.com/buildkite/buildkite-logs v0.6.1/go.mod h1:ejxwp0IDk7Wd0yTH0Cvnw8GgRGnpboe6Up4k9SGmWTg= -github.com/buildkite/go-buildkite/v4 v4.5.1 h1:45Vgtua5PlZwaaHiI0i7Zz9icOS8PTHkW1YIetpf7Xs= -github.com/buildkite/go-buildkite/v4 v4.5.1/go.mod h1:fMPu+/7hXzJ7Gy3HpGuVCLgeHqzDdrgHuwQvt8p370I= github.com/buildkite/go-buildkite/v4 v4.6.0 h1:9CSR/ENA5pc1rqp1fjlybKeG3VAKsLN8qCiNzvUAQW8= github.com/buildkite/go-buildkite/v4 v4.6.0/go.mod h1:fMPu+/7hXzJ7Gy3HpGuVCLgeHqzDdrgHuwQvt8p370I= github.com/buildkite/terminal-to-html/v3 v3.16.8 h1:QN/daUob6cmK8GcdKnwn9+YTlPr1vNj+oeAIiJK6fPc= @@ -163,7 +119,6 @@ github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -177,11 +132,8 @@ github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9 github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= -github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= github.com/google/wire v0.7.0 h1:JxUKI6+CVBgCO2WToKy/nQk0sS+amI9z9EjVmdaocj4= github.com/google/wire v0.7.0/go.mod h1:n6YbUQD9cPKTnHXEBN2DXlOp/mVADhVErcMFb0v3J18= github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= @@ -254,7 +206,6 @@ github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZ github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= @@ -289,113 +240,44 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= gocloud.dev v0.43.0 h1:aW3eq4RMyehbJ54PMsh4hsp7iX8cO/98ZRzJJOzN/5M= gocloud.dev v0.43.0/go.mod h1:eD8rkg7LhKUHrzkEdLTZ+Ty/vgPHPCd+yMQdfelQVu4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= -golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/api v0.243.0 h1:sw+ESIJ4BVnlJcWu9S+p2Z6Qq1PjG77T8IJ1xtp4jZQ= -google.golang.org/api v0.243.0/go.mod h1:GE4QtYfaybx1KmeHMdBnNnyLzBZCVihGBXAmJu/uUr8= google.golang.org/api v0.248.0 h1:hUotakSkcwGdYUqzCRc5yGYsg4wXxpkKlW5ryVqvC1Y= google.golang.org/api v0.248.0/go.mod h1:yAFUAF56Li7IuIQbTFoLwXTCI6XCFKueOlS7S9e4F9k= google.golang.org/genproto v0.0.0-20250715232539-7130f93afb79 h1:Nt6z9UHqSlIdIGJdz6KhTIs2VRx/iOsA5iE8bmQNcxs= google.golang.org/genproto v0.0.0-20250715232539-7130f93afb79/go.mod h1:kTmlBHMPqR5uCZPBvwa2B18mvubkjyY3CRLI0c6fj0s= google.golang.org/genproto/googleapis/api v0.0.0-20250715232539-7130f93afb79 h1:iOye66xuaAK0WnkPuhQPUFy8eJcmwUXqGGP3om6IxX8= google.golang.org/genproto/googleapis/api v0.0.0-20250715232539-7130f93afb79/go.mod h1:HKJDgKsFUnv5VAGeQjz8kxcgDP0HoE0iZNp0OdZNlhE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 h1:MAKi5q709QWfnkkpNQ0M12hYJ1+e8qYVDyowc4U1XZM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= -google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= -google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/buildkite/access_token.go b/pkg/buildkite/access_token.go index 8684307..8eb59a0 100644 --- a/pkg/buildkite/access_token.go +++ b/pkg/buildkite/access_token.go @@ -2,15 +2,11 @@ package buildkite import ( "context" - "encoding/json" - "fmt" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" - "go.opentelemetry.io/otel/attribute" ) type AccessTokenClient interface { @@ -33,15 +29,6 @@ func AccessToken(client AccessTokenClient) (tool mcp.Tool, handler server.ToolHa return mcp.NewToolResultError(err.Error()), nil } - r, err := json.Marshal(&token) - if err != nil { - return nil, fmt.Errorf("failed to marshal token: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &token) } } diff --git a/pkg/buildkite/annotations.go b/pkg/buildkite/annotations.go index eaeec5c..3786cfc 100644 --- a/pkg/buildkite/annotations.go +++ b/pkg/buildkite/annotations.go @@ -2,10 +2,7 @@ package buildkite import ( "context" - "encoding/json" - "fmt" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" @@ -82,16 +79,10 @@ func ListAnnotations(client AnnotationsClient) (tool mcp.Tool, handler server.To }, } - r, err := json.Marshal(&result) - if err != nil { - return nil, fmt.Errorf("failed to marshal annotations: %w", err) - } - span.SetAttributes( attribute.Int("item_count", len(annotations)), - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), ) - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &result) } } diff --git a/pkg/buildkite/artifacts.go b/pkg/buildkite/artifacts.go index 7e5362a..062b883 100644 --- a/pkg/buildkite/artifacts.go +++ b/pkg/buildkite/artifacts.go @@ -192,15 +192,6 @@ func GetArtifact(client ArtifactsClient) (tool mcp.Tool, handler server.ToolHand "encoding": "base64", } - r, err := json.Marshal(result) - if err != nil { - return nil, fmt.Errorf("failed to marshal artifact response: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &result) } } diff --git a/pkg/buildkite/buildkite.go b/pkg/buildkite/buildkite.go index e565250..fe551c1 100644 --- a/pkg/buildkite/buildkite.go +++ b/pkg/buildkite/buildkite.go @@ -1,8 +1,14 @@ package buildkite import ( + "encoding/json" + "fmt" + + "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) type PaginatedResult[T any] struct { @@ -110,3 +116,16 @@ func applyClientSidePagination[T any](items []T, params ClientSidePaginationPara HasPrev: params.Page > 1, } } + +func mcpTextResult(span trace.Span, result any) (*mcp.CallToolResult, error) { + r, err := json.Marshal(result) + if err != nil { + return mcp.NewToolResultError(fmt.Sprintf("failed to marshal result: %v", err)), nil + } + + span.SetAttributes( + attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), + ) + + return mcp.NewToolResultText(string(r)), nil +} diff --git a/pkg/buildkite/builds.go b/pkg/buildkite/builds.go index d787bed..8a2f393 100644 --- a/pkg/buildkite/builds.go +++ b/pkg/buildkite/builds.go @@ -349,12 +349,7 @@ func GetBuildTestEngineRuns(client BuildsClient) (tool mcp.Tool, handler mcp.Typ testEngineRuns = build.TestEngine.Runs } - r, err := json.Marshal(&testEngineRuns) - if err != nil { - return nil, fmt.Errorf("failed to marshal test engine runs: %w", err) - } - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &testEngineRuns) } } @@ -435,12 +430,7 @@ func GetBuild(client BuildsClient) (tool mcp.Tool, handler mcp.TypedToolHandlerF return mcp.NewToolResultError("detail_level must be 'summary', 'detailed', or 'full'"), nil } - r, err := json.Marshal(result) - if err != nil { - return nil, fmt.Errorf("failed to marshal build: %w", err) - } - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &result) } } @@ -550,11 +540,7 @@ func CreateBuild(client BuildsClient) (tool mcp.Tool, handler mcp.TypedToolHandl return mcp.NewToolResultError(err.Error()), nil } - r, err := json.Marshal(&build) - if err != nil { - return nil, fmt.Errorf("failed to marshal created build: %w", err) - } - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &build) } } @@ -694,12 +680,7 @@ func WaitForBuild(client BuildsClient) (tool mcp.Tool, handler mcp.TypedToolHand // default to detailed result := detailBuild(build) - r, err := json.Marshal(result) - if err != nil { - return nil, fmt.Errorf("failed to marshal build: %w", err) - } - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &result) } } diff --git a/pkg/buildkite/cluster_queue.go b/pkg/buildkite/cluster_queue.go index b0e3f78..e4a09f0 100644 --- a/pkg/buildkite/cluster_queue.go +++ b/pkg/buildkite/cluster_queue.go @@ -2,10 +2,7 @@ package buildkite import ( "context" - "encoding/json" - "fmt" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" @@ -75,17 +72,11 @@ func ListClusterQueues(client ClusterQueuesClient) (tool mcp.Tool, handler serve }, } - r, err := json.Marshal(&result) - if err != nil { - return nil, fmt.Errorf("failed to marshal cluster queues response: %w", err) - } - span.SetAttributes( attribute.Int("item_count", len(queues)), - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), ) - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &result) } } @@ -134,15 +125,6 @@ func GetClusterQueue(client ClusterQueuesClient) (tool mcp.Tool, handler server. return mcp.NewToolResultError(err.Error()), nil } - r, err := json.Marshal(queue) - if err != nil { - return nil, fmt.Errorf("failed to marshal cluster queue response: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &queue) } } diff --git a/pkg/buildkite/clusters.go b/pkg/buildkite/clusters.go index e1394e3..c66fa5a 100644 --- a/pkg/buildkite/clusters.go +++ b/pkg/buildkite/clusters.go @@ -2,10 +2,7 @@ package buildkite import ( "context" - "encoding/json" - "fmt" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" @@ -66,17 +63,11 @@ func ListClusters(client ClustersClient) (tool mcp.Tool, handler server.ToolHand }, } - r, err := json.Marshal(&result) - if err != nil { - return nil, fmt.Errorf("failed to marshal clusters response: %w", err) - } - span.SetAttributes( attribute.Int("item_count", len(clusters)), - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), ) - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &result) } } @@ -116,15 +107,6 @@ func GetCluster(client ClustersClient) (tool mcp.Tool, handler server.ToolHandle return mcp.NewToolResultError(err.Error()), nil } - r, err := json.Marshal(cluster) - if err != nil { - return nil, fmt.Errorf("failed to marshal cluster response: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &cluster) } } diff --git a/pkg/buildkite/joblogs.go b/pkg/buildkite/joblogs.go index 5349fea..ac62612 100644 --- a/pkg/buildkite/joblogs.go +++ b/pkg/buildkite/joblogs.go @@ -2,14 +2,12 @@ package buildkite import ( "context" - "encoding/json" "fmt" "iter" "regexp" "time" buildkitelogs "github.com/buildkite/buildkite-logs" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/mark3labs/mcp-go/mcp" "go.opentelemetry.io/otel/attribute" @@ -258,17 +256,11 @@ func SearchLogs(client BuildkiteLogsClient) (tool mcp.Tool, handler mcp.TypedToo QueryTimeMS: queryTime.Milliseconds(), } - r, err := json.Marshal(&response) - if err != nil { - return nil, fmt.Errorf("failed to marshal search results: %w", err) - } - span.SetAttributes( attribute.Int("item_count", len(results)), - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), ) - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &response) } } @@ -359,17 +351,11 @@ func TailLogs(client BuildkiteLogsClient) (tool mcp.Tool, handler mcp.TypedToolH QueryTimeMS: queryTime.Milliseconds(), } - r, err := json.Marshal(&response) - if err != nil { - return nil, fmt.Errorf("failed to marshal tail results: %w", err) - } - span.SetAttributes( attribute.Int("item_count", len(entries)), - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), ) - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &response) } } @@ -443,16 +429,7 @@ func GetLogsInfo(client BuildkiteLogsClient) (tool mcp.Tool, handler mcp.TypedTo QueryTimeMS: queryTime.Milliseconds(), } - r, err := json.Marshal(&response) - if err != nil { - return nil, fmt.Errorf("failed to marshal file info: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &response) } } @@ -547,16 +524,10 @@ func ReadLogs(client BuildkiteLogsClient) (tool mcp.Tool, handler mcp.TypedToolH QueryTimeMS: queryTime.Milliseconds(), } - r, err := json.Marshal(&response) - if err != nil { - return nil, fmt.Errorf("failed to marshal read results: %w", err) - } - span.SetAttributes( attribute.Int("item_count", len(entries)), - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), ) - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &response) } } diff --git a/pkg/buildkite/jobs.go b/pkg/buildkite/jobs.go index 98d17c9..98731b1 100644 --- a/pkg/buildkite/jobs.go +++ b/pkg/buildkite/jobs.go @@ -421,11 +421,6 @@ func UnblockJob(client JobsClient) (tool mcp.Tool, handler mcp.TypedToolHandlerF return mcp.NewToolResultError(err.Error()), nil } - r, err := json.Marshal(job) - if err != nil { - return nil, fmt.Errorf("failed to marshal job: %w", err) - } - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &job) } } diff --git a/pkg/buildkite/organizations.go b/pkg/buildkite/organizations.go index 38fbf90..c4673eb 100644 --- a/pkg/buildkite/organizations.go +++ b/pkg/buildkite/organizations.go @@ -2,15 +2,11 @@ package buildkite import ( "context" - "encoding/json" - "fmt" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" - "go.opentelemetry.io/otel/attribute" ) type OrganizationsClient interface { @@ -37,16 +33,7 @@ func UserTokenOrganization(client OrganizationsClient) (tool mcp.Tool, handler s return mcp.NewToolResultError("no organization found for the current user token"), nil } - r, err := json.Marshal(&orgs[0]) - if err != nil { - return nil, fmt.Errorf("failed to marshal user organizations: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &orgs[0]) } } diff --git a/pkg/buildkite/pipelines.go b/pkg/buildkite/pipelines.go index ae3ed06..d283852 100644 --- a/pkg/buildkite/pipelines.go +++ b/pkg/buildkite/pipelines.go @@ -2,12 +2,10 @@ package buildkite import ( "context" - "encoding/json" "errors" "fmt" "net/url" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" @@ -99,7 +97,7 @@ func ListPipelines(client PipelinesClient) (tool mcp.Tool, handler mcp.TypedTool headers := map[string]string{"Link": resp.Header.Get("Link")} - var result interface{} + var result any switch args.DetailLevel { case "summary": result = createPaginatedResult(pipelines, summarizePipeline, headers) @@ -109,17 +107,11 @@ func ListPipelines(client PipelinesClient) (tool mcp.Tool, handler mcp.TypedTool result = createPaginatedResult(pipelines, func(p buildkite.Pipeline) buildkite.Pipeline { return p }, headers) } - r, err := json.Marshal(result) - if err != nil { - return nil, fmt.Errorf("failed to marshal pipelines: %w", err) - } - span.SetAttributes( attribute.Int("item_count", len(pipelines)), - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), ) - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &result) } } @@ -190,16 +182,7 @@ func GetPipeline(client PipelinesClient) (tool mcp.Tool, handler mcp.TypedToolHa result = pipeline } - r, err := json.Marshal(result) - if err != nil { - return nil, fmt.Errorf("failed to marshal pipeline: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &result) } } @@ -400,16 +383,7 @@ func CreatePipeline(client PipelinesClient) (tool mcp.Tool, handler mcp.TypedToo return mcp.NewToolResultError(err.Error()), nil } - r, err := json.Marshal(&pipeline) - if err != nil { - return nil, fmt.Errorf("failed to marshal issue: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &pipeline) } } @@ -520,15 +494,6 @@ func UpdatePipeline(client PipelinesClient) (mcp.Tool, mcp.TypedToolHandlerFunc[ return mcp.NewToolResultError(err.Error()), nil } - r, err := json.Marshal(&pipeline) - if err != nil { - return nil, fmt.Errorf("failed to marshal pipeline: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &pipeline) } } diff --git a/pkg/buildkite/test_executions.go b/pkg/buildkite/test_executions.go index 7c0be03..2016739 100644 --- a/pkg/buildkite/test_executions.go +++ b/pkg/buildkite/test_executions.go @@ -2,10 +2,7 @@ package buildkite import ( "context" - "encoding/json" - "fmt" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" @@ -82,16 +79,11 @@ func GetFailedTestExecutions(client TestExecutionsClient) (tool mcp.Tool, handle // Always apply client-side pagination result := applyClientSidePagination(failedExecutions, paginationParams) - r, err := json.Marshal(&result) - if err != nil { - return nil, fmt.Errorf("failed to marshal failed executions: %w", err) - } span.SetAttributes( attribute.Int("item_count", len(failedExecutions)), - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), ) - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &result) } } diff --git a/pkg/buildkite/test_runs.go b/pkg/buildkite/test_runs.go index 8fcccf7..839f8a0 100644 --- a/pkg/buildkite/test_runs.go +++ b/pkg/buildkite/test_runs.go @@ -147,11 +147,6 @@ func GetTestRun(client TestRunsClient) (tool mcp.Tool, handler server.ToolHandle return mcp.NewToolResultError(fmt.Sprintf("failed to get test run: %s", string(body))), nil } - r, err := json.Marshal(&testRun) - if err != nil { - return nil, fmt.Errorf("failed to marshal test run: %w", err) - } - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &testRun) } } diff --git a/pkg/buildkite/tests.go b/pkg/buildkite/tests.go index e22b002..b9c0b00 100644 --- a/pkg/buildkite/tests.go +++ b/pkg/buildkite/tests.go @@ -2,10 +2,7 @@ package buildkite import ( "context" - "encoding/json" - "fmt" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" @@ -64,15 +61,6 @@ func GetTest(client TestsClient) (tool mcp.Tool, handler server.ToolHandlerFunc) return mcp.NewToolResultError(err.Error()), nil } - r, err := json.Marshal(&test) - if err != nil { - return nil, fmt.Errorf("failed to marshal test: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &test) } } diff --git a/pkg/buildkite/user.go b/pkg/buildkite/user.go index 49ace31..57fa9ad 100644 --- a/pkg/buildkite/user.go +++ b/pkg/buildkite/user.go @@ -2,15 +2,11 @@ package buildkite import ( "context" - "encoding/json" - "fmt" - "github.com/buildkite/buildkite-mcp-server/pkg/tokens" "github.com/buildkite/buildkite-mcp-server/pkg/trace" "github.com/buildkite/go-buildkite/v4" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" - "go.opentelemetry.io/otel/attribute" ) type UserClient interface { @@ -33,15 +29,6 @@ func CurrentUser(client UserClient) (tool mcp.Tool, handler server.ToolHandlerFu return mcp.NewToolResultError(err.Error()), nil } - r, err := json.Marshal(&user) - if err != nil { - return nil, fmt.Errorf("failed to marshal user: %w", err) - } - - span.SetAttributes( - attribute.Int("estimated_tokens", tokens.EstimateTokens(string(r))), - ) - - return mcp.NewToolResultText(string(r)), nil + return mcpTextResult(span, &user) } }