Skip to content

Commit d8bda0a

Browse files
authored
Add MCP server (#51)
1 parent 51bb509 commit d8bda0a

6 files changed

Lines changed: 281 additions & 5 deletions

File tree

go.mod

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/djthorpe/go-wasmbuild v0.0.6
77
github.com/jackc/pgx/v5 v5.10.0
88
github.com/mutablelogic/go-client v1.4.9
9+
github.com/mutablelogic/go-llm v0.4.4
910
github.com/mutablelogic/go-server v1.6.36
1011
github.com/stretchr/testify v1.11.1
1112
github.com/testcontainers/testcontainers-go v0.42.0
@@ -25,7 +26,7 @@ require (
2526
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
2627
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2728
github.com/charmbracelet/colorprofile v0.4.3 // indirect
28-
github.com/charmbracelet/lipgloss v1.1.0 // indirect
29+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 // indirect
2930
github.com/charmbracelet/x/ansi v0.11.7 // indirect
3031
github.com/charmbracelet/x/cellbuf v0.0.15 // indirect
3132
github.com/charmbracelet/x/term v0.2.2 // indirect
@@ -35,23 +36,34 @@ require (
3536
github.com/containerd/errdefs/pkg v0.3.0 // indirect
3637
github.com/containerd/log v0.1.0 // indirect
3738
github.com/containerd/platforms v0.2.1 // indirect
39+
github.com/coreos/go-oidc/v3 v3.18.0 // indirect
3840
github.com/cpuguy83/dockercfg v0.3.2 // indirect
3941
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
42+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 // indirect
4043
github.com/distribution/reference v0.6.0 // indirect
4144
github.com/docker/go-connections v0.7.0 // indirect
4245
github.com/docker/go-units v0.5.0 // indirect
4346
github.com/ebitengine/purego v0.10.1 // indirect
4447
github.com/felixge/httpsnoop v1.0.4 // indirect
48+
github.com/go-jose/go-jose/v4 v4.1.4 // indirect
4549
github.com/go-logr/logr v1.4.3 // indirect
4650
github.com/go-logr/stdr v1.2.2 // indirect
4751
github.com/go-ole/go-ole v1.3.0 // indirect
52+
github.com/goccy/go-json v0.10.6 // indirect
53+
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect
4854
github.com/google/jsonschema-go v0.4.3 // indirect
4955
github.com/google/uuid v1.6.0 // indirect
5056
github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect
5157
github.com/jackc/pgpassfile v1.0.0 // indirect
5258
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
5359
github.com/jackc/puddle/v2 v2.2.2 // indirect
5460
github.com/klauspost/compress v1.18.6 // indirect
61+
github.com/lestrrat-go/blackmagic v1.0.4 // indirect
62+
github.com/lestrrat-go/httpcc v1.0.1 // indirect
63+
github.com/lestrrat-go/httprc v1.0.6 // indirect
64+
github.com/lestrrat-go/iter v1.0.2 // indirect
65+
github.com/lestrrat-go/jwx/v2 v2.1.6 // indirect
66+
github.com/lestrrat-go/option v1.0.1 // indirect
5567
github.com/lucasb-eyer/go-colorful v1.4.0 // indirect
5668
github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e // indirect
5769
github.com/magiconair/properties v1.8.10 // indirect
@@ -66,19 +78,24 @@ require (
6678
github.com/moby/sys/user v0.4.0 // indirect
6779
github.com/moby/sys/userns v0.1.0 // indirect
6880
github.com/moby/term v0.5.2 // indirect
81+
github.com/modelcontextprotocol/go-sdk v1.6.0 // indirect
6982
github.com/muesli/termenv v0.16.0 // indirect
83+
github.com/mutablelogic/go-auth v0.0.14 // indirect
7084
github.com/mutablelogic/go-tokenizer v0.0.3 // indirect
7185
github.com/opencontainers/go-digest v1.0.0 // indirect
7286
github.com/opencontainers/image-spec v1.1.1 // indirect
7387
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
7488
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
7589
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
7690
github.com/rivo/uniseg v0.4.7 // indirect
91+
github.com/segmentio/asm v1.2.1 // indirect
92+
github.com/segmentio/encoding v0.5.4 // indirect
7793
github.com/shirou/gopsutil/v4 v4.26.5 // indirect
7894
github.com/sirupsen/logrus v1.9.4 // indirect
7995
github.com/tklauser/go-sysconf v0.4.0 // indirect
8096
github.com/tklauser/numcpus v0.12.0 // indirect
8197
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
98+
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
8299
github.com/yusufpapurcu/wmi v1.2.4 // indirect
83100
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
84101
go.opentelemetry.io/contrib/bridges/otelslog v0.19.0 // indirect
@@ -97,6 +114,7 @@ require (
97114
go.opentelemetry.io/proto/otlp v1.10.0 // indirect
98115
golang.org/x/crypto v0.53.0 // indirect
99116
golang.org/x/net v0.56.0 // indirect
117+
golang.org/x/oauth2 v0.36.0 // indirect
100118
golang.org/x/sys v0.46.0 // indirect
101119
golang.org/x/term v0.44.0 // indirect
102120
golang.org/x/text v0.38.0 // indirect

go.sum

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF
2424
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
2525
github.com/charmbracelet/colorprofile v0.4.3 h1:QPa1IWkYI+AOB+fE+mg/5/4HRMZcaXex9t5KX76i20Q=
2626
github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q=
27-
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
28-
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
27+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0ro+SZZiIZD7msJyA+NjkCNNavuiPBLgerbOziE=
28+
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA=
2929
github.com/charmbracelet/x/ansi v0.11.7 h1:kzv1kJvjg2S3r9KHo8hDdHFQLEqn4RBCb39dAYC84jI=
3030
github.com/charmbracelet/x/ansi v0.11.7/go.mod h1:9qGpnAVYz+8ACONkZBUWPtL7lulP9No6p1epAihUZwQ=
3131
github.com/charmbracelet/x/cellbuf v0.0.15 h1:ur3pZy0o6z/R7EylET877CBxaiE1Sp1GMxoFPAIztPI=
3232
github.com/charmbracelet/x/cellbuf v0.0.15/go.mod h1:J1YVbR7MUuEGIFPCaaZ96KDl5NoS0DAWkskup+mOY+Q=
33-
github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30=
34-
github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
33+
github.com/charmbracelet/x/exp/golden v0.0.0-20260430013151-79116d1f37bd h1:N0gYk0lh6dfeb7iztIhDdLtg6ZGrFIAkDLD0mKoJwLM=
34+
github.com/charmbracelet/x/exp/golden v0.0.0-20260430013151-79116d1f37bd/go.mod h1:6fMpcW6iwN/kX+xJ52eqVWsDiBTe0UJD24JLoHFe+P0=
3535
github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
3636
github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI=
3737
github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSEFgwIwO+UVM8=
@@ -46,13 +46,17 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
4646
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
4747
github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
4848
github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
49+
github.com/coreos/go-oidc/v3 v3.18.0 h1:V9orjXynvu5wiC9SemFTWnG4F45v403aIcjWo0d41+A=
50+
github.com/coreos/go-oidc/v3 v3.18.0/go.mod h1:DYCf24+ncYi+XkIH97GY1+dqoRlbaSI26KVTCI9SrY4=
4951
github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA=
5052
github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc=
5153
github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
5254
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
5355
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5456
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
5557
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
58+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3hK/4HUq48LQ6Wwqo=
59+
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
5660
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
5761
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
5862
github.com/djthorpe/go-wasmbuild v0.0.6 h1:GwcXGsObsC4IqpOlLppK2eX8T480AWIA9oNElyQb3Do=
@@ -65,6 +69,8 @@ github.com/ebitengine/purego v0.10.1 h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/
6569
github.com/ebitengine/purego v0.10.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
6670
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
6771
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
72+
github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA=
73+
github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
6874
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
6975
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
7076
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -73,6 +79,10 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre
7379
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
7480
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
7581
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
82+
github.com/goccy/go-json v0.10.6 h1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU=
83+
github.com/goccy/go-json v0.10.6/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
84+
github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=
85+
github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
7686
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
7787
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
7888
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -99,6 +109,18 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
99109
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
100110
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
101111
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
112+
github.com/lestrrat-go/blackmagic v1.0.4 h1:IwQibdnf8l2KoO+qC3uT4OaTWsW7tuRQXy9TRN9QanA=
113+
github.com/lestrrat-go/blackmagic v1.0.4/go.mod h1:6AWFyKNNj0zEXQYfTMPfZrAXUWUfTIZ5ECEUEJaijtw=
114+
github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE=
115+
github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E=
116+
github.com/lestrrat-go/httprc v1.0.6 h1:qgmgIRhpvBqexMJjA/PmwSvhNk679oqD1RbovdCGW8k=
117+
github.com/lestrrat-go/httprc v1.0.6/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo=
118+
github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
119+
github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
120+
github.com/lestrrat-go/jwx/v2 v2.1.6 h1:hxM1gfDILk/l5ylers6BX/Eq1m/pnxe9NBwW6lVfecA=
121+
github.com/lestrrat-go/jwx/v2 v2.1.6/go.mod h1:Y722kU5r/8mV7fYDifjug0r8FK8mZdw0K0GpJw/l8pU=
122+
github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU=
123+
github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
102124
github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4=
103125
github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
104126
github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e h1:Q6MvJtQK/iRcRtzAscm/zF23XxJlbECiGPyRicsX+Ak=
@@ -127,10 +149,16 @@ github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g
127149
github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
128150
github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
129151
github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=
152+
github.com/modelcontextprotocol/go-sdk v1.6.0 h1:PPLS3kn7WtOEnR+Af4X5H96SG0qSab8R/ZQT/HkhPkY=
153+
github.com/modelcontextprotocol/go-sdk v1.6.0/go.mod h1:kzm3kzFL1/+AziGOE0nUs3gvPoNxMCvkxokMkuFapXQ=
130154
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
131155
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
156+
github.com/mutablelogic/go-auth v0.0.14 h1:4oK+NOuTLLVb7LxlCI3fuzuuCer4hG5/nfdaMbnecKE=
157+
github.com/mutablelogic/go-auth v0.0.14/go.mod h1:LVy12hxaci0i+zCEtmu35GJctvJHylsNHvkRjpjs7Lc=
132158
github.com/mutablelogic/go-client v1.4.9 h1:1JHLha6u0u0mEQEHc4K0Pq6EJMwd8F0DR/ahQrzTAlA=
133159
github.com/mutablelogic/go-client v1.4.9/go.mod h1:g8c6RlvIC0wC5rpoqtqk7eznBxormwrxArxH9I5rNRQ=
160+
github.com/mutablelogic/go-llm v0.4.4 h1:uvC2hfvL95v8E53iwBFsMTCwZqSHgMf1Vm1ZtRW/lKU=
161+
github.com/mutablelogic/go-llm v0.4.4/go.mod h1:J1DetK4aP+JstDM5Z3b4H+HKRFKMRjCBcsdml+tYKvI=
134162
github.com/mutablelogic/go-server v1.6.36 h1:zJl6Fju8Q0XEa/D3jRWeKNskMCd9LjSC8UyUJAzQC7A=
135163
github.com/mutablelogic/go-server v1.6.36/go.mod h1:WEitTi2S39tM0xkmhm0aMNzb7NqhkaqJmwfHpaVtycw=
136164
github.com/mutablelogic/go-tokenizer v0.0.3 h1:6oaa80TaAl+nVpd+M9QhlJPbP7y5/thq4d0dKjreiLs=
@@ -150,6 +178,10 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
150178
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
151179
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
152180
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
181+
github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0=
182+
github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
183+
github.com/segmentio/encoding v0.5.4 h1:OW1VRern8Nw6ITAtwSZ7Idrl3MXCFwXHPgqESYfvNt0=
184+
github.com/segmentio/encoding v0.5.4/go.mod h1:HS1ZKa3kSN32ZHVZ7ZLPLXWvOVIiZtyJnO1gPH1sKt0=
153185
github.com/shirou/gopsutil/v4 v4.26.5 h1:RPcBXkpz7kOj9PqGFQOlBPZHsyaPvPVQc098y9RmCNM=
154186
github.com/shirou/gopsutil/v4 v4.26.5/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ=
155187
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
@@ -158,7 +190,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
158190
github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4=
159191
github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0=
160192
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
193+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
161194
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
195+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
162196
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
163197
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
164198
github.com/testcontainers/testcontainers-go v0.42.0 h1:He3IhTzTZOygSXLJPMX7n44XtK+qhjat1nI9cneBbUY=
@@ -169,6 +203,8 @@ github.com/tklauser/numcpus v0.12.0 h1:NR85qdvHA9pFse3x3weVZ0r0ST8R6l5RHbZrlRaqo
169203
github.com/tklauser/numcpus v0.12.0/go.mod h1:ABHeXzJnr/qqwguhClkZKT1/8VABcYrsyUiUGobwWJg=
170204
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
171205
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
206+
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
207+
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
172208
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
173209
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
174210
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
@@ -219,6 +255,8 @@ golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM
219255
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
220256
golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
221257
golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
258+
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
259+
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
222260
golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
223261
golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
224262
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -231,6 +269,8 @@ golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
231269
golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
232270
golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
233271
golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
272+
golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
273+
golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
234274
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
235275
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
236276
google.golang.org/genproto/googleapis/api v0.0.0-20260610212136-7ab31c22f7ad h1:3iLyITS/sySRwbUKoC7ogfj2Yr1Cjs0pfaRKj5U5HEw=

pgmanager/cmd/server.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import (
55
"fmt"
66

77
// Packages
8+
mcpserver "github.com/mutablelogic/go-llm/mcp/server"
89
pg "github.com/mutablelogic/go-pg"
910
httphandlers "github.com/mutablelogic/go-pg/pgmanager/httphandlers"
1011
manager "github.com/mutablelogic/go-pg/pgmanager/manager"
12+
"github.com/mutablelogic/go-pg/pgmanager/mcp"
1113
pgpkg "github.com/mutablelogic/go-pg/pkg/cmd"
1214
server "github.com/mutablelogic/go-server"
1315
cmd "github.com/mutablelogic/go-server/pkg/cmd"
16+
httprequest "github.com/mutablelogic/go-server/pkg/httprequest"
1417
httprouter "github.com/mutablelogic/go-server/pkg/httprouter"
1518
errgroup "golang.org/x/sync/errgroup"
1619
)
@@ -25,6 +28,7 @@ type ServerCommands struct {
2528
type RunServer struct {
2629
cmd.RunServer
2730
pgpkg.PostgresFlags `embed:"" prefix:"pg."`
31+
MCP bool `name:"mcp" help:"Enable an MCP endpoint" negatable:"" default:"false"`
2832
}
2933

3034
///////////////////////////////////////////////////////////////////////////////
@@ -63,6 +67,34 @@ func (runner *RunServer) Run(ctx server.Cmd) error {
6367
)
6468
})
6569

70+
// If MCP is enabled, register the MCP handler
71+
runner.Register(func(router *httprouter.Router) error {
72+
if !runner.MCP {
73+
return nil
74+
}
75+
76+
ctx.Logger().DebugContext(ctx.Context(), "registering pgmanager mcp server")
77+
78+
// Set options
79+
opts := []mcpserver.ServerOpt{
80+
mcpserver.WithInstructions("Manage PostgreSQL database clusters, databases, roles, schemas, and more."),
81+
mcpserver.WithTracer(ctx.Tracer()),
82+
}
83+
84+
// Create an MCP server
85+
mcpServer, err := mcp.New(pgmanager, ctx.Name(), ctx.Version(), opts...)
86+
if err != nil {
87+
return err
88+
}
89+
90+
// Serve the MCP endpoint
91+
handler := mcpServer.Handler()
92+
return router.RegisterPath("/mcp", nil, httprequest.NewPathItem("MCP", "Management Control Protocol endpoint").
93+
Post(handler.ServeHTTP, "Send a message to the MCP server").
94+
Delete(handler.ServeHTTP, "Close an MCP session"),
95+
)
96+
})
97+
6698
// Run the manager
6799
errgroup.Go(func() error {
68100
return pgmanager.Run(errctx)

pgmanager/mcp/ping.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package mcp
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
7+
// Packages
8+
"github.com/mutablelogic/go-llm"
9+
"github.com/mutablelogic/go-server/pkg/jsonschema"
10+
)
11+
12+
////////////////////////////////////////////////////////////////////////////////
13+
// PUBLIC METHODS
14+
15+
func (mcp *Server) Ping() llm.Tool {
16+
self := new(tool)
17+
self.manager = mcp.manager
18+
self.name = "ping"
19+
self.title = "Ping"
20+
self.description = "Ping the PostgreSQL cluster and return health status"
21+
self.output = jsonschema.MustFor[struct {
22+
OK bool `json:"ok"`
23+
}]()
24+
self.fn = func(ctx context.Context, _ json.RawMessage) (any, error) {
25+
if err := self.manager.Ping(ctx); err != nil {
26+
return nil, err
27+
}
28+
return struct {
29+
OK bool `json:"ok"`
30+
}{OK: true}, nil
31+
}
32+
return self
33+
}

0 commit comments

Comments
 (0)