MCP Server Suite
A production-ready suite of Model Context Protocol servers enabling AI agents to access AWS resources, perform SQLite database operations, and scrape web pages through natural language.
README
MCP Server Suite
A production-ready suite of Model Context Protocol (MCP) servers in TypeScript. Gives AI agents (Kiro, Claude Desktop, Cursor) programmatic access to AWS resources, local databases, and web scraping capabilities.
Zero Cost Guarantee
This project costs $0 to build, test, and run. No paid APIs, no cloud hosting, no subscriptions. See Cost Breakdown below.
Documentation
| Document | Purpose |
|---|---|
| Manual Testing Guide | Step-by-step: install, build, test, run manually |
| Interview Guide | How to explain this project, demo script, talking points |
| API Reference | Full tool input/output schemas |
| Architecture Deep Dive | Data flow, patterns, security |
Architecture
graph TB
subgraph "AI Clients"
K[Kiro IDE]
CD[Claude Desktop]
CU[Cursor]
end
subgraph "MCP Transport Layer"
STDIO[stdio / JSON-RPC 2.0]
end
subgraph "MCP Server Suite"
subgraph "aws-explorer"
S3[list-s3-buckets<br/>list-s3-objects]
EC2[list-ec2-instances<br/>describe-ec2-instance]
LAMBDA[list-lambda-functions<br/>describe-lambda-function]
DYNAMO[list-dynamodb-tables<br/>describe-dynamodb-table]
end
subgraph "database"
QUERY[query]
INSERT[insert]
UPDATE[update]
DELETE[delete]
SCHEMA[list-tables / describe-table<br/>create-table]
end
subgraph "web-scraper"
FETCH[fetch-page]
LINKS[extract-links]
TEXT[extract-text]
SEARCH[search-in-page]
end
subgraph "shared"
LOGGER[Logger]
ERRORS[Error Handling]
TYPES[Response Types]
MW[Middleware<br/>Retry / Circuit Breaker]
end
end
subgraph "External Services"
AWS[AWS SDK v3]
SQLITE[SQLite via sql.js]
WEB[Web / HTTP]
end
K & CD & CU --> STDIO
STDIO --> S3 & EC2 & LAMBDA & DYNAMO
STDIO --> QUERY & INSERT & UPDATE & DELETE & SCHEMA
STDIO --> FETCH & LINKS & TEXT & SEARCH
S3 & EC2 & LAMBDA & DYNAMO --> AWS
QUERY & INSERT & UPDATE & DELETE & SCHEMA --> SQLITE
FETCH & LINKS & TEXT & SEARCH --> WEB
aws-explorer & database & web-scraper -.-> shared
Package Structure
graph LR
ROOT[mcp-server-suite<br/>Turborepo Monorepo]
ROOT --> SHARED["@mcp-suite/shared<br/>Logger, Errors, Types, Middleware"]
ROOT --> AWS["@mcp-suite/aws-explorer<br/>8 tools, 2 resources"]
ROOT --> DB["@mcp-suite/database<br/>7 tools, 3 resources"]
ROOT --> WS["@mcp-suite/web-scraper<br/>4 tools, 1 resource"]
AWS --> SHARED
DB --> SHARED
WS --> SHARED
Quick Start
Prerequisites
- Node.js >= 18.0.0
- npm >= 10.0.0
- AWS credentials configured (for aws-explorer)
Installation
git clone <repository-url>
cd mcp-server-suite
npm install
npm run build
Running Tests
npm run test # Run all tests (184 tests across 4 packages)
npm run test:coverage # Run with coverage reports
Configure with Kiro
Add to your .kiro/settings/mcp.json:
{
"mcpServers": {
"aws-explorer": {
"command": "node",
"args": ["./packages/aws-explorer/dist/index.js"]
},
"database": {
"command": "node",
"args": ["./packages/database/dist/index.js"],
"env": {
"MCP_DB_PATH": "./data/my-database.db"
}
},
"web-scraper": {
"command": "node",
"args": ["./packages/web-scraper/dist/index.js"]
}
}
}
Configure with Claude Desktop
{
"mcpServers": {
"aws-explorer": {
"command": "node",
"args": ["/absolute/path/to/packages/aws-explorer/dist/index.js"]
},
"database": {
"command": "node",
"args": ["/absolute/path/to/packages/database/dist/index.js"]
},
"web-scraper": {
"command": "node",
"args": ["/absolute/path/to/packages/web-scraper/dist/index.js"]
}
}
}
Packages
@mcp-suite/aws-explorer
Provides read-only access to AWS resources. Requires AWS credentials via environment variables, CLI profile, or IAM role.
| Tool | Description |
|---|---|
list-s3-buckets |
List all S3 buckets, optionally filter by prefix |
list-s3-objects |
List objects in a bucket with prefix filtering |
list-lambda-functions |
List Lambda functions with runtime/memory info |
describe-lambda-function |
Get detailed Lambda config including env vars |
list-dynamodb-tables |
List DynamoDB tables with optional details |
describe-dynamodb-table |
Get table schema, indexes, throughput |
list-ec2-instances |
List EC2 instances, filter by state |
describe-ec2-instance |
Full instance details including networking |
Resources:
aws://config/region— Current AWS regionaws://config/account— Account configuration summary
@mcp-suite/database
SQLite database operations via sql.js (pure JavaScript, no native deps). Supports full CRUD with safety guardrails.
| Tool | Description |
|---|---|
query |
Execute read-only SQL (SELECT/WITH/EXPLAIN/PRAGMA) |
insert |
Insert single or batch rows |
update |
Update rows (WHERE clause required) |
delete |
Delete rows (WHERE clause required) |
list-tables |
List all tables with optional row counts |
describe-table |
Get column info, types, constraints, indexes |
create-table |
Create new tables with schema definition |
Resources:
db://schema/tables— All table namesdb://schema/full— Complete schema for all tablesdb://info— Database path, size, config
Environment Variables:
MCP_DB_PATH— Path to SQLite file (default:./mcp-data.db)
@mcp-suite/web-scraper
Fetch and parse web pages using cheerio. No browser required.
| Tool | Description |
|---|---|
fetch-page |
Fetch page as text/html/markdown/metadata |
extract-links |
Extract links with internal/external filtering |
extract-text |
Extract text via CSS selectors |
search-in-page |
Search for text patterns with context |
Resources:
scraper://config— Scraper configuration and limits
@mcp-suite/shared
Shared utilities used by all servers.
| Module | Exports |
|---|---|
logger.ts |
Logger, createLogger, LogLevel — Structured JSON logging to stderr |
errors.ts |
McpServerError, NotFoundError, ValidationError, AuthError, RateLimitError, ExternalServiceError, formatErrorResponse, withErrorHandling |
types.ts |
createTextResponse, createJsonResponse, createErrorResponse, type definitions |
middleware.ts |
withRetry, CircuitBreaker, createRequestContext, generateCorrelationId |
Design Patterns
Repository Pattern (Database)
classDiagram
class IDatabaseRepository {
<<interface>>
+listTables(includeRowCounts?) TableListResult
+describeTable(tableName) TableSchema
+createTable(tableName, columns, ifNotExists?) WriteResult
+query(sql, params?, limit?) QueryResult
+insert(table, data) BatchInsertResult
+update(table, set, where, params?) WriteResult
+delete(table, where, params?) WriteResult
}
class DatabaseRepository {
-isReadOnlyQuery(sql) boolean
-validateTableExists(table) void
-validateWhereClause(where, operation) void
}
class queryTool
class insertTool
class updateTool
class deleteTool
IDatabaseRepository <|.. DatabaseRepository
queryTool --> DatabaseRepository
insertTool --> DatabaseRepository
updateTool --> DatabaseRepository
deleteTool --> DatabaseRepository
Circuit Breaker (Shared Middleware)
stateDiagram-v2
[*] --> CLOSED
CLOSED --> OPEN : failure threshold reached
OPEN --> HALF_OPEN : recovery time elapsed
HALF_OPEN --> CLOSED : success
HALF_OPEN --> OPEN : failure
CLOSED --> CLOSED : success / below threshold
Error Handling Flow
flowchart TD
A[Tool Called] --> B{Execute}
B -->|Success| C[createJsonResponse]
B -->|Error| D{Error Type?}
D -->|ValidationError| E[createErrorResponse<br/>400]
D -->|NotFoundError| F[createErrorResponse<br/>404]
D -->|RateLimitError| G[Retry with backoff]
D -->|ExternalServiceError| H[Circuit Breaker check]
D -->|Unknown Error| I[formatErrorResponse<br/>500]
G -->|Max retries| I
H -->|Circuit OPEN| J[Service unavailable]
H -->|Circuit CLOSED| B
Tech Stack
| Layer | Technology |
|---|---|
| Language | TypeScript 5.x (strict mode) |
| MCP SDK | @modelcontextprotocol/sdk |
| Validation | Zod v3 |
| Transport | stdio (JSON-RPC 2.0) |
| AWS | AWS SDK v3 (modular clients) |
| Database | sql.js (pure JS SQLite) |
| Web Parsing | cheerio |
| Build | Turborepo monorepo |
| Test | Vitest |
| Module | ES2022 / Node16 resolution |
Development
# Build all packages
npm run build
# Type check without emitting
npm run typecheck
# Run tests
npm run test
# Clean build artifacts
npm run clean
Environment Variables
| Variable | Package | Description |
|---|---|---|
AWS_REGION |
aws-explorer | AWS region (default: us-east-1) |
AWS_PROFILE |
aws-explorer | AWS CLI profile name |
AWS_ACCESS_KEY_ID |
aws-explorer | AWS access key |
AWS_SECRET_ACCESS_KEY |
aws-explorer | AWS secret key |
MCP_DB_PATH |
database | SQLite file path |
MCP_LOG_LEVEL |
all | DEBUG, INFO, WARN, ERROR, SILENT |
Cost
| Item | Cost |
|---|---|
| AWS SDK | $0 — read-only operations on existing resources |
| npm packages | All free/open-source |
| MCP SDK | Free & open-source |
| sql.js | Free (public domain SQLite) |
| Deployment | $0 — runs locally |
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。