{"_id":"@aws/mcp-amqp-transport","_rev":"3-1a3ec13c6e17db7699dab51c86831713","name":"@aws/mcp-amqp-transport","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@aws/mcp-amqp-transport","version":"1.0.0","keywords":["mcp","amqp","transport","model-context-protocol"],"author":"","license":"Apache-2.0","_id":"@aws/mcp-amqp-transport@1.0.0","maintainers":[{"name":"amazon-mq-npm","email":"amazon-mq-npm@amazon.com"}],"homepage":"https://github.com/amazon-mq/mcp-amqp-transport#readme","bugs":{"url":"https://github.com/amazon-mq/mcp-amqp-transport/issues"},"bin":{"mcp-client-amqp-adaptor":"dist/adaptor/mcp_client_amqp_adaptor.js","mcp-server-amqp-adaptor":"dist/adaptor/mcp_server_amqp_adaptor.js"},"dist":{"shasum":"fcc3c6b6b00b5326a0afadae358a374a34d72d8d","tarball":"https://registry.npmjs.org/@aws/mcp-amqp-transport/-/mcp-amqp-transport-1.0.0.tgz","fileCount":46,"integrity":"sha512-+S5V2hPrFz5UebxubX12kMd0iYyJk2eBAfm33I8dx5EFq0bPNlxIbqT0PXNzgCGoy26dZpizDSq4+9u9+mSOgg==","signatures":[{"sig":"MEUCIQC0fP119OyBhp3nrecqeRFYZjffP0TqgO5xwkZpyoplXwIgVGR1XE1+bRt+4fbnvqCKeZzVVyEWA99XsWk/dWrgNkA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":129799},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"5fea5b1f3e4a806c0f31ba85894ff9f0573347c6","scripts":{"lint":"eslint src tests --ext .ts","test":"jest","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"","prepare":"husky install","lint:fix":"eslint src tests --ext .ts --fix","test:watch":"jest --watch","type-check":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"amazon-mq-npm","email":"amazon-mq-npm@amazon.com"},"repository":{"url":"git+https://github.com/amazon-mq/mcp-amqp-transport.git","type":"git"},"_npmVersion":"10.8.2","description":"AMQP transport implementation for Model Context Protocol","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"20.19.5","dependencies":{"amqplib":"^0.10.9","commander":"^12.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","husky":"^8.0.3","eslint":"^8.57.1","ts-jest":"^29.1.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","lint-staged":"^15.5.2","@types/amqplib":"^0.10.7","eslint-config-prettier":"^9.1.2","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"peerDependencies":{"@modelcontextprotocol/sdk":"^1.19.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-amqp-transport_1.0.0_1762028030727_0.9937342511799467","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aws/mcp-amqp-transport","version":"1.0.1","keywords":["mcp","amqp","transport","model-context-protocol"],"author":"","license":"Apache-2.0","_id":"@aws/mcp-amqp-transport@1.0.1","maintainers":[{"name":"amazon-mq-npm","email":"amazon-mq-npm@amazon.com"}],"homepage":"https://github.com/amazon-mq/mcp-amqp-transport#readme","bugs":{"url":"https://github.com/amazon-mq/mcp-amqp-transport/issues"},"bin":{"mcp-client-amqp-adaptor":"dist/adaptor/mcp_client_amqp_adaptor.js","mcp-server-amqp-adaptor":"dist/adaptor/mcp_server_amqp_adaptor.js"},"dist":{"shasum":"b421999c10bdf5d3d93b0d7c7be4882361b3f3fb","tarball":"https://registry.npmjs.org/@aws/mcp-amqp-transport/-/mcp-amqp-transport-1.0.1.tgz","fileCount":46,"integrity":"sha512-xlI9GSthKUMRTo3zTuNs8ytACfO+nxb8cgfqhAAuyOrTNBnkXuX8QHULVewbfhPXwIc7Sc6ztW7eqf6nLeJkXQ==","signatures":[{"sig":"MEUCIQCKDw2d+ryWBLHj1+eJA5MQppvQAU2z9DlhA7218uzzcgIgBJbZWFJU3F8yQaFtMBvSH+VXTIp3/8eyz3+X/T/h5/4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":137843},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"75ef2de6ae0c788179abd7ec1a1c7d593252b320","scripts":{"lint":"eslint src tests --ext .ts","test":"jest","build":"tsc","format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"","prepare":"husky install","lint:fix":"eslint src tests --ext .ts --fix","test:watch":"jest --watch","type-check":"tsc --noEmit","format:check":"prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"amazon-mq-npm","email":"amazon-mq-npm@amazon.com"},"repository":{"url":"git+https://github.com/amazon-mq/mcp-amqp-transport.git","type":"git"},"_npmVersion":"10.8.2","description":"AMQP transport implementation for Model Context Protocol","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"_nodeVersion":"20.19.5","dependencies":{"amqplib":"^0.10.9","commander":"^12.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","husky":"^8.0.3","eslint":"^8.57.1","ts-jest":"^29.1.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","lint-staged":"^15.5.2","@types/amqplib":"^0.10.7","eslint-config-prettier":"^9.1.2","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"peerDependencies":{"@modelcontextprotocol/sdk":"^1.19.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-amqp-transport_1.0.1_1762030406707_0.20575155774971154","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aws/mcp-amqp-transport","version":"1.0.2","description":"AMQP transport implementation for Model Context Protocol","main":"dist/index.js","types":"dist/index.d.ts","bin":{"mcp-client-amqp-adaptor":"dist/adaptor/mcp_client_amqp_adaptor.js","mcp-server-amqp-adaptor":"dist/adaptor/mcp_server_amqp_adaptor.js"},"scripts":{"build":"tsc","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint src tests --ext .ts","lint:fix":"eslint src tests --ext .ts --fix","format":"prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\" \"tests/**/*.ts\"","type-check":"tsc --noEmit","prepare":"husky install","prepublishOnly":"npm run build"},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"engines":{"node":">=18.0.0"},"keywords":["mcp","amqp","transport","model-context-protocol"],"author":"","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/amazon-mq/mcp-amqp-transport.git"},"peerDependencies":{"@modelcontextprotocol/sdk":"^1.19.0"},"dependencies":{"amqplib":"^0.10.9","commander":"^12.0.0"},"devDependencies":{"@types/amqplib":"^0.10.7","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","eslint":"^8.57.1","eslint-config-prettier":"^9.1.2","husky":"^8.0.3","jest":"^29.5.0","lint-staged":"^15.5.2","prettier":"^3.6.2","ts-jest":"^29.1.0","typescript":"^5.0.0"},"_id":"@aws/mcp-amqp-transport@1.0.2","gitHead":"b3a7f1b5354ed7b55ae0e37515be477b7748f044","bugs":{"url":"https://github.com/amazon-mq/mcp-amqp-transport/issues"},"homepage":"https://github.com/amazon-mq/mcp-amqp-transport#readme","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-gaiLNr5vnDJ2F8Grd/4drMoaw9R75FocVPNVZSEG+tvy/153x/Vqg5tFi00dLfHzEcdIC7CpVcBCtHedK+4PRA==","shasum":"19e7f6f2a199fef78dcf5980d8d72171affd9798","tarball":"https://registry.npmjs.org/@aws/mcp-amqp-transport/-/mcp-amqp-transport-1.0.2.tgz","fileCount":46,"unpackedSize":139141,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC5/8JbIDHAkkkN6601Kzbrr1JNnuDTyrOJ6sTX56vpAQIhAOz5+H3AZihEPxtnomtVlp6M2pV7JhmorKYCigRIVrlD"}]},"_npmUser":{"name":"amazon-mq-npm","email":"amazon-mq-npm@amazon.com"},"directories":{},"maintainers":[{"name":"amazon-mq-npm","email":"amazon-mq-npm@amazon.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-amqp-transport_1.0.2_1762041408170_0.8661921673893744"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-01T20:13:50.593Z","modified":"2025-11-01T23:56:48.592Z","1.0.0":"2025-11-01T20:13:50.909Z","1.0.1":"2025-11-01T20:53:26.909Z","1.0.2":"2025-11-01T23:56:48.359Z"},"bugs":{"url":"https://github.com/amazon-mq/mcp-amqp-transport/issues"},"license":"Apache-2.0","homepage":"https://github.com/amazon-mq/mcp-amqp-transport#readme","keywords":["mcp","amqp","transport","model-context-protocol"],"repository":{"type":"git","url":"git+https://github.com/amazon-mq/mcp-amqp-transport.git"},"description":"AMQP transport implementation for Model Context Protocol","maintainers":[{"name":"amazon-mq-npm","email":"amazon-mq-npm@amazon.com"}],"readme":"# MCP AMQP Transport\n\nAMQP transport implementation for the Model Context Protocol (MCP), enabling MCP servers and clients to communicate over AMQP message brokers like RabbitMQ.\n\n## Features\n\n- **AMQP Transport Layer**: Full implementation of MCP transport over AMQP 0-9-1 protocol\n- **Client & Server Support**: Both `ClientAMQPTransport` and `ServerAMQPTransport` classes\n- **CLI Adaptors**: Command-line tools to bridge stdio-based MCP servers/clients with AMQP\n- **Interceptor Framework**: Base class for building message interceptors\n- **Flexible Configuration**: Support for environment variables and direct configuration\n- **TLS Support**: Secure connections with AMQPS\n\n## Installation\n\n```bash\nnpm install -g @aws/mcp-amqp-transport\n```\n\n## Usage\n\n### Using Transport Classes\n\nYou need to configure the following environment variables:\n```\nAMQP_HOSTNAME - AMQP broker hostname\nAMQP_USERNAME - username for your broker\nAMQP_PASSWORD - password for your broker\nAMQP_PORT - AMQP broker port (default: 5672 for AMQP, 5671 for AMQPS) \nAMQP_USE_TLS - Use TLS connection (default: true)\n```\n\nExample:\n```bash\nexport AMQP_HOSTNAME=localhost\nexport AMQP_PORT=5672\nexport AMQP_USERNAME=guest\nexport AMQP_PASSWORD=guest\nexport AMQP_USE_TLS=false\n```\n\n#### Server Transport\n\n```typescript\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { ServerAMQPTransport } from '@aws/mcp-amqp-transport';\n\nconst server = new Server(\n  { name: 'my-server', version: '1.0.0' },\n  { capabilities: {} }\n);\n\n// Configuration via environment variables\nconst transport = new ServerAMQPTransport({\n  name: 'my-server',\n  exchangeName: 'mcp-exchange'\n  // hostname, port, username, password read from environment variables\n});\n\nawait server.connect(transport);\n```\n\n#### Client Transport\n\n```typescript\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { ClientAMQPTransport } from '@aws/mcp-amqp-transport';\n\nconst client = new Client(\n  { name: 'my-client', version: '1.0.0' },\n  { capabilities: {} }\n);\n\n// Configuration via environment variables\nconst transport = new ClientAMQPTransport({\n  serverName: 'my-server',\n  exchangeName: 'mcp-exchange'\n  // hostname, port, username, password read from environment variables\n});\n\nawait client.connect(transport);\n```\n\n### Using CLI Adaptors\n\nThe package includes two CLI tools for bridging stdio-based MCP implementations with AMQP:\n\n#### Server Adaptor\n\nWraps an existing stdio-based MCP server to communicate over AMQP:\n\n```bash\n# Set environment variables\nexport AMQP_HOSTNAME=localhost\nexport AMQP_PORT=5672\nexport AMQP_USERNAME=guest\nexport AMQP_PASSWORD=guest\nexport AMQP_USE_TLS=false\n\nmcp-server-amqp-adaptor \\\n  --serverName my-server \\\n  --exchangeName mcp-exchange \\\n  --command \"npx\" \\\n  --args \"-y\" \"@modelcontextprotocol/server-everything\" \\\n  --additional-metadata \"region=us-east-1,env=prod\"\n```\n\n#### Client Adaptor\n\nProvides a stdio interface for MCP clients to connect to AMQP-based servers:\n\n```bash\n# Set environment variables\nexport AMQP_HOSTNAME=localhost\nexport AMQP_PORT=5672\nexport AMQP_USERNAME=guest\nexport AMQP_PASSWORD=guest\nexport AMQP_USE_TLS=false\n\nmcp-client-amqp-adaptor \\\n  --serverName my-server \\\n  --exchangeName mcp-exchange \\\n  --additional-metadata \"clientType=web,version=1.0\"\n```\n\n> **Note:** If you didn't install globally with `-g`, then you need to use `npx`.\n\n### Building Interceptors\n```bash\n# Set environment variables\nexport AMQP_HOSTNAME=localhost\nexport AMQP_PORT=5672\nexport AMQP_USERNAME=guest\nexport AMQP_PASSWORD=guest\nexport AMQP_USE_TLS=false\n```\n\nCreate custom message interceptors for monitoring, security, caching, or analytics:\n\n```typescript\nimport { InterceptorBase, MessageProcessStatus } from '@aws/mcp-amqp-transport';\n\nclass MonitoringInterceptor extends InterceptorBase {\n  async proccessClientToMCPMessage(message: any): Promise<MessageProcessStatus> {\n    console.log('Client -> MCP:', message);\n    // Add monitoring logic here\n    return MessageProcessStatus.FORWARD;\n  }\n\n  async proccessMCPToClientMessage(message: any): Promise<MessageProcessStatus> {\n    console.log('MCP -> Client:', message);\n    // Add monitoring logic here\n    return MessageProcessStatus.FORWARD;\n  }\n}\n\n// Configuration via environment variables\nconst interceptor = new MonitoringInterceptor({\n  inExchange: 'mcp-exchange-in',\n  outExchange: 'mcp-exchange-out'\n  // hostname, username, password read from environment variables\n});\n\nawait interceptor.start();\n```\n\n## Configuration\n\nThe adaptors and SDK require an exchange to be specified on both the client and server. This is the key to decoupling mcp-client and mcp-server communication.\n\nIn `mcp-client-amqp-adaptor`, you specify the `serverName`, which is the MCP server you want to connect to, as well as the exchange to publish to and consume from.\nIn `mcp-server-amqp-adaptor`, you declare the `serverName` as an identifier for the client and also specify an exchange to publish to and consume from.\n\nIf you set the `exchangeName` to be the same in both adaptors, then messages will go directly from client to server. You can monitor and control the flow using the broker engine.\n\nHowever, you can extend the architecture by adding your own interceptor to process these messages. You can have an application that sits in the middle:\n\n```mermaid\nflowchart LR\n    A[MCP Client] --> B[Client Adaptor]\n    B --> D[Interceptor]\n    D --> E[Server Adaptor]\n    E --> F[MCP Server]\n    \n    F --> E\n    E --> D\n    D --> B\n    B --> A\n```\n\nThe client adaptor binds to exchange-A, and the server adaptor binds to exchange-B. The interceptor (you can use the interceptor SDK) will process and route messages between exchange-A and exchange-B.\n\n\nAll transport classes and CLI tools support configuration via:\n\n1. **Direct options** (highest priority)\n2. **Environment variables** (fallback)\n\n### Environment Variables\n\n- `AMQP_HOSTNAME`: AMQP broker hostname\n- `AMQP_USERNAME`: AMQP username\n- `AMQP_PASSWORD`: AMQP password\n- `AMQP_PORT`: AMQP broker port (default: 5672 for AMQP, 5671 for AMQPS)\n- `AMQP_USE_TLS`: Use TLS connection (default: true)\n\n### CLI Options\n\nBoth adaptors support the following additional options:\n\n- `--additional-metadata`: Custom metadata as key=value pairs (comma-separated) to include in message headers\n\n## Architecture\n\n### Message Flow\n\n```\nClient -> [mcp.{serverName}.request] -> Server\nServer -> [from-mcp.{serverName}.client-id.{clientId}] -> Client\n```\n\n### Routing Keys\n\n- **Client to Server**: `mcp.{serverName}.request`\n- **Server to Client**: `from-mcp.{serverName}.client-id.{clientId}`\n- **Reply routing key**: Passed in message headers as `routingKeyToReply`\n\n### Message ID Handling\n\nThe transport automatically augments message IDs with client identifiers to support multiple concurrent clients:\n\n- Client sends message with `id: 1`\n- Transport augments to `id: \"client-uuid-1\"`\n- Server processes and responds with augmented ID\n- Transport normalizes back to `id: 1` for client\n\n## API Reference\n\n### ServerAMQPTransport\n\n```typescript\ninterface ServerAMQPTransportOptions {\n  name: string;              // Server name\n  exchangeName: string;      // AMQP exchange name\n  hostname?: string;         // Broker hostname\n  port?: number;            // Broker port\n  username?: string;        // AMQP username\n  password?: string;        // AMQP password\n  useTLS?: boolean;         // Use TLS connection\n}\n```\n\n### ClientAMQPTransport\n\n```typescript\ninterface ClientAMQPTransportOptions {\n  serverName: string;       // Target server name\n  exchangeName: string;     // AMQP exchange name\n  hostname?: string;        // Broker hostname\n  port?: number;           // Broker port\n  username?: string;       // AMQP username\n  password?: string;       // AMQP password\n  useTLS?: boolean;        // Use TLS connection\n}\n```\n\n### InterceptorBase\n\n```typescript\ninterface InterceptorOptions {\n  inExchange: string;       // Input exchange\n  outExchange: string;      // Output exchange\n  hostname?: string;        // Broker hostname\n  port?: number;           // Broker port\n  username?: string;       // AMQP username\n  password?: string;       // AMQP password\n  useTLS?: boolean;        // Use TLS connection\n}\n\nenum MessageProcessStatus {\n  FORWARD = 'forward',      // Forward message unchanged\n  REJECT = 'reject',        // Reject message and send it back to the previous exchange\n  ERROR = 'error',          // Error occurred\n  DROP = 'drop',            // Drop message\n  TRANSFORM = 'transform'   // Transform message and forward that instead\n}\n```\n\n## Development\n\n### Code Quality Tools\n\nThis project uses ESLint, Prettier, and TypeScript for code quality and consistency.\n\n#### Available Scripts\n\n```bash\n# Run linter\nnpm run lint\n\n# Auto-fix linting issues\nnpm run lint:fix\n\n# Check code formatting\nnpm run format:check\n\n# Format code\nnpm run format\n\n# Type checking\nnpm run type-check\n\n# Run tests\nnpm test\n\n# Build the project\nnpm run build\n```\n\n#### Pre-commit Hooks\n\nThe project uses Husky and lint-staged to automatically lint and format code before commits. This ensures all committed code meets quality standards.\n\n## Security\n\nSee [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.\n\n## License\n\nThis project is licensed under the Apache-2.0 License.","readmeFilename":"README.md"}