Provides search capabilities for academic papers and research publications on arXiv
Integrates with AWS Secrets Manager for secure storage and retrieval of API keys and sensitive configuration data
Enables search and content retrieval from Wikipedia articles for research and citation purposes
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@NexusNote MCP Serverfind recent papers on quantum computing from arXiv"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Server
MCP-compatible WebSocket server with a companion Amplify-ready React frontend. Use the commands below to run locally, build containers, or deploy to AWS.
Local Development
The server listens on 0.0.0.0:8080. Modify src/config/env.ts if you need different bindings.
Optional environment overrides:
BEDROCK_MAX_OUTPUT_TOKENS(default 512)BEDROCK_TEMPERATURE(default 0.2)MCP_HOST/MCP_PORTMCP_DYNAMODB_TABLE_CONFIG(semicolon-separated entriestable|partitionKey|sortKey|gsiName|gsiPartitionKey|gsiSortKey)MCP_CHAT_TABLE_NAME(optional table selector when multiple entries are supplied)TOOL_METRICS_EMIT_EMF(set totrueto emit CloudWatch Embedded Metric Format logs for tool calls)
Frontend (Amplify-ready)
Deploy with AWS Amplify Hosting by connecting this repo and keeping the generated amplify.yml. The build pipeline runs npm ci at the repo root and publishes apps/frontend/dist. Set VITE_API_BASE_URL, VITE_COGNITO_REGION, VITE_COGNITO_USER_POOL_ID, and VITE_COGNITO_USER_POOL_CLIENT_ID in Amplify’s environment settings.
Optional frontend flags:
VITE_CHAT_USE_STREAMING=trueenables the SSE-based/chat/streamendpoint so the UI can show live status updates while the assistant thinks.
Chat API & persistence
The MCP server exposes a small REST surface alongside the /chat orchestrator endpoint:
Endpoint | Method | Description |
|
| Execute the next turn in a conversation. Accepts |
|
| Same payload as |
|
| List conversation summaries for the authenticated user. |
|
| Retrieve the full message history for a session (ordered by |
|
| Search prior chat messages using a DynamoDB scan scoped to the authenticated user. |
|
| Prometheus text-format metrics (tool success/failure counters, retries, circuit state). |
External tool calls (SerpAPI, Wikipedia, arXiv) automatically retry with exponential backoff, short-term caching, and circuit breakers to soften upstream outages.
Chat history is stored in DynamoDB. Provide table metadata via MCP_DYNAMODB_TABLE_CONFIG, for example:
The table uses:
PK:
sessionIdSK: ISO timestamp for messages,
__SUMMARY__for the summary itemGSI (optional but recommended):
userIndexonuserId/lastMessageAtfor listing conversations by user
Set MCP_CHAT_TABLE_NAME when multiple tables are defined and you need to select the chat store explicitly.
When you deploy via the provided CDK stack, leave MCP_CREATE_CHAT_TABLE=true to have the chat history table (and its userIndex GSI) created automatically. Use MCP_CHAT_TABLE_NAME if you need to control the physical table name; the stack wires both MCP_DYNAMODB_TABLE_CONFIG and MCP_CHAT_TABLE_NAME into the service task definition.
Docker Image
AWS Deployment (manual)
Set deployment config
cd mcp/infrastructure cp .env.example .env # edit .env with your account ID, Cognito pool/client, Bedrock model, etc.Key variables:
MCP_ACCOUNT_ID,MCP_REGIONMCP_COGNITO_USER_POOL_ID,MCP_COGNITO_USER_POOL_CLIENT_IDMCP_BEDROCK_MODEL_ID(defaults tometa.llama3-8b-instruct-v1:0)MCP_SERPAPI_SECRET_NAME(Secrets Manager entry containing the SerpAPI key)MCP_DYNAMODB_TABLE_ARNS(comma-separated DynamoDB table ARNs the service may read)MCP_DYNAMODB_TABLE_CONFIG(semicolon-separated table descriptorstable|partitionKey|sortKey|gsiName|gsiPartitionKey|gsiSortKey)MCP_CREATE_CHAT_TABLE(defaults totrue; set tofalseto skip provisioning the managed chat table)MCP_CHAT_TABLE_NAME(optional explicit name when provisioning the managed chat table)Optional: configure a custom domain directly in the App Runner console after deployment (not automated by this stack yet).
Bootstrap (first time per account/region)
Create the SerpAPI secret (once)
aws secretsmanager create-secret \ --name nexusnote/mcp/search-api \ --secret-string "<YOUR_SERPAPI_KEY>"Deploy – make sure Docker is running locally.
cd mcp/infrastructure npm install # safe to re-run npm run build # compile CDK app npm run synth # optional: inspect CloudFormation npm run deploy # deploys the McpStack stackThe deploy step builds a Docker image locally and provisions an App Runner service. If Docker isn’t running you’ll see
Cannot connect to the Docker daemon .... After a successful deploy, note theServiceHttpsUrloutput; use it for REST calls and replace thehttps://prefix withwss://when configuring WebSocket clients.Pause/resume to control cost (optional)
SERVICE_ARN=<AppRunnerServiceArn from outputs> aws apprunner pause-service --service-arn "$SERVICE_ARN" aws apprunner resume-service --service-arn "$SERVICE_ARN"
App Runner bills only while the service is running. Pausing is the easiest way to keep the monthly cost under a dollar when you only need the tooling a few hours per month.
Teardown (optional)
cd mcp/infrastructure
npm run destroy