Skip to content

feat(mcp): add Event Bus MCP server #81

Open
daniyal-rana wants to merge 28 commits into
mainfrom
experiment/feat/mcp
Open

feat(mcp): add Event Bus MCP server #81
daniyal-rana wants to merge 28 commits into
mainfrom
experiment/feat/mcp

Conversation

@daniyal-rana

@daniyal-rana daniyal-rana commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds new feature: mcp/dsx-exchange-mcp.

This read-only server exposes the NATS event bus and AsyncAPI schema to MCP clients:

  • discovering embedded AsyncAPI schemas
  • Bounded MQTT subscriptions to event bus:
    • ACLs managed by auth callout
    • Spins up new MCP client per tool call
  • Developer Preview disclaimer in `mcp/dsx-exchange-mcp/README.md
  • Added optional MCP client skill guidance under mcp/dsx-exchange-mcp/skills/ to help agent clients use schema discovery, retained reads, and bounded live subscriptions consistently.

`

What Changed

  • Added mcp/dsx-exchange-mcp Go module.
  • Added MCP server implementation, including:
    • schema/topic discovery over embedded AsyncAPI specs
    • bounded MQTT collect/subscribe tools
    • bearer token pass-through for MQTT auth
    • structured error handling for invalid topics, auth failures, broker failures, caps, and caller cancellation
  • Added embedded schema sync flow for AsyncAPI specs.
  • Added Docker build support for the MCP server.
  • Added Helm deployment assets for the MCP server.
  • Added CI coverage for the new module:
    • Go lint
    • unit tests
    • schema sync verification
    • Docker build
    • container scan
    • Helm validation
  • Added local/Skaffold wiring so the MCP service can be built/deployed with the local stack.
  • Added MCP README and architecture/client guidance docs.
  • Root schemas/ is now the single source of truth for MCP embedded specs: Makefile handles local sync automatically. Docker/Skaffold copy root schemas directly.

Vendor Note

This PR intentionally includes mcp/dsx-exchange-mcp/vendor/.

Not Included

Local load-test tooling and generated load-test artifacts are intentionally not part of this PR. Those were
used only for local validation and were kept out to avoid PR bloat.

Validation

Ran successfully:

  • git diff --check
  • make check
  • make -C mcp/dsx-exchange-mcp verify-specs
  • make -C mcp/dsx-exchange-mcp test
  • make -C mcp/dsx-exchange-mcp lint
  • make -C mcp/dsx-exchange-mcp build
  • make -C mcp/dsx-exchange-mcp image
  • make -C local skaffold-run from a clean Kind state
  • make -C local skaffold-run again against the same state

Skaffold validation confirmed:

  • MCP image builds from repo-root Docker context
  • MCP image is pushed to the local registry
  • MCP Helm release deploys successfully
  • MCP pod reaches Ready in kind-csc

Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Add bounded MQTT admission controls, pod-local watch status aggregation, load validation tooling, and concise upstream docs for the DSX Exchange MCP server.

Validation: go test -mod=vendor ./...; go vet -mod=vendor ./...; go build server/load binaries; helm lint/template; bash -n load wrapper; git diff --check.
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
@daniyal-rana daniyal-rana self-assigned this Jun 24, 2026
@copy-pr-bot

copy-pr-bot Bot commented Jun 24, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 332 files, which is 32 over the limit of 300.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: eb2c1dde-5a53-4157-b6fd-5330f7cdaf89

📥 Commits

Reviewing files that changed from the base of the PR and between 41d8c1d and 0042317.

⛔ Files ignored due to path filters (2)
  • THIRD_PARTY_LICENSES.csv is excluded by !**/*.csv
  • mcp/dsx-exchange-mcp/go.sum is excluded by !**/*.sum
📒 Files selected for processing (332)
  • .github/workflows/ci.yml
  • .gitignore
  • Makefile
  • README.md
  • auth-callout/scripts/regenerate-third-party-licenses.sh
  • local/Makefile
  • local/README.md
  • mcp/dsx-exchange-mcp/.gitignore
  • mcp/dsx-exchange-mcp/Architecture.md
  • mcp/dsx-exchange-mcp/Dockerfile
  • mcp/dsx-exchange-mcp/Dockerfile.dockerignore
  • mcp/dsx-exchange-mcp/Makefile
  • mcp/dsx-exchange-mcp/README.md
  • mcp/dsx-exchange-mcp/cmd/dsx-exchange-mcp/main.go
  • mcp/dsx-exchange-mcp/deploy/helm/dsx-exchange-mcp/Chart.yaml
  • mcp/dsx-exchange-mcp/deploy/helm/dsx-exchange-mcp/templates/deployment.yaml
  • mcp/dsx-exchange-mcp/deploy/helm/dsx-exchange-mcp/templates/pdb.yaml
  • mcp/dsx-exchange-mcp/deploy/helm/dsx-exchange-mcp/templates/service.yaml
  • mcp/dsx-exchange-mcp/deploy/helm/dsx-exchange-mcp/values.deployed-bus.example.yaml
  • mcp/dsx-exchange-mcp/deploy/helm/dsx-exchange-mcp/values.kind.yaml
  • mcp/dsx-exchange-mcp/deploy/helm/dsx-exchange-mcp/values.yaml
  • mcp/dsx-exchange-mcp/go.mod
  • mcp/dsx-exchange-mcp/internal/auth/caller.go
  • mcp/dsx-exchange-mcp/internal/auth/caller_test.go
  • mcp/dsx-exchange-mcp/internal/mqttbus/client.go
  • mcp/dsx-exchange-mcp/internal/mqttbus/client_test.go
  • mcp/dsx-exchange-mcp/internal/mqttbus/e2e_test.go
  • mcp/dsx-exchange-mcp/internal/schemaindex/index.go
  • mcp/dsx-exchange-mcp/internal/schemaindex/index_test.go
  • mcp/dsx-exchange-mcp/internal/schemaindex/match.go
  • mcp/dsx-exchange-mcp/internal/schemaindex/parse.go
  • mcp/dsx-exchange-mcp/internal/schemaindex/topic_helpers.go
  • mcp/dsx-exchange-mcp/internal/server/admission.go
  • mcp/dsx-exchange-mcp/internal/server/e2e_test.go
  • mcp/dsx-exchange-mcp/internal/server/llm_eval_test.go
  • mcp/dsx-exchange-mcp/internal/server/resources.go
  • mcp/dsx-exchange-mcp/internal/server/run.go
  • mcp/dsx-exchange-mcp/internal/server/server.go
  • mcp/dsx-exchange-mcp/internal/server/testdata/tool_call_expectations.json
  • mcp/dsx-exchange-mcp/internal/server/tools.go
  • mcp/dsx-exchange-mcp/internal/server/tools_test.go
  • mcp/dsx-exchange-mcp/internal/server/transport_test.go
  • mcp/dsx-exchange-mcp/internal/specs/data/.gitkeep
  • mcp/dsx-exchange-mcp/internal/specs/specs.go
  • mcp/dsx-exchange-mcp/schemas/embed.go
  • mcp/dsx-exchange-mcp/skaffold.yaml
  • mcp/dsx-exchange-mcp/skills/dsx-exchange-mcp/SKILL.md
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/.gitignore
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/CODE_OF_CONDUCT.md
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/CONTRIBUTING.md
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/LICENSE
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/NOTICE.md
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/README.md
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/SECURITY.md
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/backoff.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/client.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/components.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/connnotf.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/edl-v10
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/epl-v20
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/filestore.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/memstore.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/memstore_ordered.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/message.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/messageids.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/net.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/netconn.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/oops.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/options.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/options_reader.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/connack.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/connect.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/disconnect.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/packets.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/pingreq.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/pingresp.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/puback.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/pubcomp.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/publish.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/pubrec.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/pubrel.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/suback.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/subscribe.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/unsuback.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/packets/unsubscribe.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/ping.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/router.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/status.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/store.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/token.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/topic.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/trace.go
  • mcp/dsx-exchange-mcp/vendor/github.com/eclipse/paho.mqtt.golang/websocket.go
  • mcp/dsx-exchange-mcp/vendor/github.com/google/jsonschema-go/LICENSE
  • mcp/dsx-exchange-mcp/vendor/github.com/google/jsonschema-go/jsonschema/annotations.go
  • mcp/dsx-exchange-mcp/vendor/github.com/google/jsonschema-go/jsonschema/doc.go
  • mcp/dsx-exchange-mcp/vendor/github.com/google/jsonschema-go/jsonschema/infer.go
  • mcp/dsx-exchange-mcp/vendor/github.com/google/jsonschema-go/jsonschema/json_pointer.go
  • mcp/dsx-exchange-mcp/vendor/github.com/google/jsonschema-go/jsonschema/resolve.go
  • mcp/dsx-exchange-mcp/vendor/github.com/google/jsonschema-go/jsonschema/schema.go
  • mcp/dsx-exchange-mcp/vendor/github.com/google/jsonschema-go/jsonschema/util.go
  • mcp/dsx-exchange-mcp/vendor/github.com/google/jsonschema-go/jsonschema/validate.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/.gitignore
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/AUTHORS
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/LICENSE
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/README.md
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/client.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/compression.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/conn.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/doc.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/join.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/json.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/mask.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/mask_safe.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/prepared.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/proxy.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/server.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/tls_handshake.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/tls_handshake_116.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/util.go
  • mcp/dsx-exchange-mcp/vendor/github.com/gorilla/websocket/x_net_proxy.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/LICENSE
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/auth/auth.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/auth/authorization_code.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/auth/client.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/auth/client_private.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/json/json.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/jsonrpc2/conn.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/jsonrpc2/frame.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/jsonrpc2/jsonrpc2.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/jsonrpc2/messages.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/jsonrpc2/net.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/jsonrpc2/serve.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/jsonrpc2/wire.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/mcpgodebug/mcpgodebug.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/util/net.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/util/util.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/internal/xcontext/xcontext.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/jsonrpc/jsonrpc.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/client.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/cmd.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/content.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/event.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/features.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/logging.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/mcp.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/prompt.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/protocol.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/requests.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/resource.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/schema_cache.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/server.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/session.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/shared.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/sse.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/streamable.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/streamable_client.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/streamable_server.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/tool.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/transport.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/mcp/util.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/oauthex/auth_meta.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/oauthex/dcr.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/oauthex/oauth2.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/oauthex/oauthex.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/oauthex/resource_meta.go
  • mcp/dsx-exchange-mcp/vendor/github.com/modelcontextprotocol/go-sdk/oauthex/resource_meta_public.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/LICENSE
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/ascii.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/equal_fold.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/equal_fold_amd64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/equal_fold_amd64.s
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/equal_fold_default.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/valid.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/valid_amd64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/valid_amd64.s
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/valid_default.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/valid_print.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/valid_print_amd64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/valid_print_amd64.s
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/ascii/valid_print_default.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/base64/base64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/base64/base64_amd64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/base64/base64_default.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/base64/decode_amd64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/base64/decode_amd64.s
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/base64/encode_amd64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/base64/encode_amd64.s
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/cpu/arm/arm.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/cpu/arm64/arm64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/cpu/cpu.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/cpu/cpuid/cpuid.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/cpu/x86/x86.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/internal/unsafebytes/unsafebytes.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/keyset/keyset.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/keyset/keyset_amd64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/keyset/keyset_amd64.s
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/keyset/keyset_arm64.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/keyset/keyset_arm64.s
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/asm/keyset/keyset_default.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/LICENSE
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/ascii/equal_fold.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/ascii/valid.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/ascii/valid_print.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/iso8601/parse.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/iso8601/valid.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/README.md
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/codec.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/decode.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/encode.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/int.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/json.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/parse.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/reflect.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/reflect_optimize.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/string.go
  • mcp/dsx-exchange-mcp/vendor/github.com/segmentio/encoding/json/token.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/LICENSE
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/README.rst
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/compile.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/equals.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/error.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/escape.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/expression.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/machine.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/match.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/parse.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/prog.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/uritemplate.go
  • mcp/dsx-exchange-mcp/vendor/github.com/yosida95/uritemplate/v3/value.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/net/LICENSE
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/net/PATENTS
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/net/internal/socks/client.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/net/internal/socks/socks.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/net/proxy/dial.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/net/proxy/direct.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/net/proxy/per_host.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/net/proxy/proxy.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/net/proxy/socks5.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/.travis.yml
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/CONTRIBUTING.md
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/LICENSE
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/README.md
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/deviceauth.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/internal/doc.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/internal/oauth2.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/internal/token.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/internal/transport.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/oauth2.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/pkce.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/token.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/oauth2/transport.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sync/LICENSE
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sync/PATENTS
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sync/semaphore/semaphore.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/LICENSE
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/PATENTS
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/asm_aix_ppc64.s
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/asm_darwin_x86_gc.s
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/byteorder.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_aix.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_arm.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_arm64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_arm64.s
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_darwin_x86.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_gc_arm64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_gc_x86.s
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_gccgo_arm64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.c
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_gccgo_x86.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_linux.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_linux_arm.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_linux_loong64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_linux_mips64x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_linux_riscv64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_loong64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_loong64.s
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_mips64x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_mipsx.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_netbsd_arm64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_openbsd_arm64.s
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_other_arm.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_other_mips64x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_other_riscv64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_other_x86.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_riscv64.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_s390x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_s390x.s
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_wasm.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_x86.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_zos.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/cpu_zos_s390x.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/endian_big.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/endian_little.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/hwcap_linux.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/parse.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/proc_cpuinfo_linux.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/runtime_auxv.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/syscall_aix_gccgo.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/syscall_aix_ppc64_gc.go
  • mcp/dsx-exchange-mcp/vendor/golang.org/x/sys/cpu/syscall_darwin_x86_gc.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/LICENSE
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/NOTICE
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/README.md
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/apic.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/decode.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/emitterc.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/encode.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/parserc.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/readerc.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/resolve.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/scannerc.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/sorter.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/writerc.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/yaml.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/yamlh.go
  • mcp/dsx-exchange-mcp/vendor/gopkg.in/yaml.v3/yamlprivateh.go
  • mcp/dsx-exchange-mcp/vendor/modules.txt
  • skaffold.yaml

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch experiment/feat/mcp

Comment @coderabbitai help to get the list of available commands.

Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
@daniyal-rana daniyal-rana marked this pull request as ready for review June 25, 2026 21:12
@daniyal-rana daniyal-rana requested a review from a team June 25, 2026 21:12
@daniyal-rana daniyal-rana requested a review from a team as a code owner June 25, 2026 21:12
@github-actions

Copy link
Copy Markdown

🔐 TruffleHog Secret Scan

No secrets or credentials found!

Your code has been scanned for 700+ types of secrets and credentials. All clear! 🎉

🔗 View scan details

🕐 Last updated: 2026-06-25 21:13:29 UTC | Commit: dcc377f

@github-actions

Copy link
Copy Markdown

🛡️ CodeQL Analysis

✅ No security issues found!

💡 Note: Enable GitHub Advanced Security to see full details in the Security tab.

🕐 Last updated: 2026-06-25 21:14:30 UTC | Commit: dcc377f

Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Signed-off-by: Daniyal Rana <daniyalr@nvidia.com>
Comment thread local/Makefile
status: ## Check deployment status
@echo "CSC Cluster:"
@kubectl get pods -n event-bus --context kind-csc 2>/dev/null || echo " NATS: Not deployed"
@kubectl get pods -n mcp-backends --context kind-csc 2>/dev/null || echo " MCP: Not deployed"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

treat this as a component of event bus, not in an mcp backend bucket

report_module "$auth_dir" "-mod=vendor"
report_module "$repo_dir/local/mqtt-client" ""
report_module "$repo_dir/local/mqttbs" ""
make -C "$repo_dir/mcp/dsx-exchange-mcp" sync-specs >/dev/null

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

symlink the specs, don't copy them around

Comment thread local/README.md

```bash
cd ../mcp/dsx-exchange-mcp
make port-forward-kind

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

metallb load balancer service instead of port forwarding

go 1.25

require (
github.com/eclipse/paho.mqtt.golang v1.5.1

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use the same config and instrumentation libraries as auth callout

@@ -0,0 +1,707 @@
# dsx-exchange-mcp Architecture

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bake the relevant parts into the readme, and update the fern docs sections


func newAdmissionLimiter(limit int) *admissionLimiter {
if limit <= 0 {
// no limit, allow all tool-calls through

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this looks like a semaphore. import one of those instead. or directly use a rate limiter package if that's what this is for.

MIMEType: "application/json",
},
func(_ context.Context, req *mcp.ReadResourceRequest) (*mcp.ReadResourceResult, error) {
body, _ := json.Marshal(map[string]any{"domains": available})

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't ignore errors

MIMEType: "application/yaml",
},
func(_ context.Context, req *mcp.ReadResourceRequest) (*mcp.ReadResourceResult, error) {
body, err := specs.Read(domain)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this appears to be pre-computable

},
Name: toolSubscribe,
Annotations: readOnlyOpenWorldAnnotations("Bounded MQTT subscribe"),
Description: "Background-friendly bounded MQTT subscribe. Any MCP client planning to call " +

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use a multiline string

Count: len(matches),
Matches: matches,
}
raw, _ := json.Marshal(out)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ignoring errors

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants