Skip to main content
Glama
ZackFairTS

AWS Athena MCP Server

by ZackFairTS
README.md
# @lishenxydlgzs/aws-athena-mcp
[![smithery badge](https://smithery.ai/badge/@lishenxydlgzs/aws-athena-mcp)](https://smithery.ai/server/@lishenxydlgzs/aws-athena-mcp)

A Model Context Protocol (MCP) server for running AWS Athena queries. This server enables AI assistants to execute SQL queries against your AWS Athena databases and retrieve results.

**Features:**
- Execute SQL queries via AWS Athena
- Support for both stdio (local) and Lambda + API Gateway (remote) deployment
- OAuth 2.0 authentication via AWS Cognito (Lambda deployment)
- Async query execution with status polling
- Named query support

<a href="https://glama.ai/mcp/servers/0i7dhkex6t">
  <img width="380" height="200" src="https://glama.ai/mcp/servers/0i7dhkex6t/badge" alt="aws-athena-mcp MCP server" />
</a>

## Deployment Options

### Option 1: Local (stdio) - For MCP Clients

Use with Claude Desktop, Cline, or other MCP clients:

### Option 1: Local (stdio) - For MCP Clients

Use with Claude Desktop, Cline, or other MCP clients:

1. Configure AWS credentials using one of the following methods:
   - AWS CLI configuration
   - Environment variables (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`)
   - IAM role (if running on AWS)

2. Add the server to your MCP configuration:

```json
{
  "mcpServers": {
    "athena": {
      "command": "npx",
      "args": ["-y", "@lishenxydlgzs/aws-athena-mcp"],
      "env": {
        // Required
        "OUTPUT_S3_PATH": "s3://your-bucket/athena-results/",
        
        // Optional AWS configuration
        "AWS_REGION": "us-east-1",                    // Default: AWS CLI default region
        "AWS_PROFILE": "default",                     // Default: 'default' profile
        "AWS_ACCESS_KEY_ID": "",                      // Optional: AWS access key
        "AWS_SECRET_ACCESS_KEY": "",                  // Optional: AWS secret key
        "AWS_SESSION_TOKEN": "",                      // Optional: AWS session token
        
        // Optional server configuration
        "ATHENA_WORKGROUP": "default_workgroup",      // Optional: specify the Athena WorkGroup
        "QUERY_TIMEOUT_MS": "300000",                 // Default: 5 minutes (300000ms)
        "MAX_RETRIES": "100",                         // Default: 100 attempts
        "RETRY_DELAY_MS": "500"                       // Default: 500ms between retries
      }
    }
  }
}
```

### Option 2: Lambda + API Gateway - For Remote Access

Deploy as a serverless API with OAuth 2.0 authentication:

```bash
# 首次部署(交互式配置)
./deploy.sh

# 或快速部署(使用已有配置)
./deploy-quick.sh
```

部署脚本会自动:
- 构建 TypeScript 代码
- 使用 SAM 部署到 AWS
- 创建 Cognito User Pool 和 App Client
- 配置 API Gateway OAuth 认证
- 输出完整的 OAuth 配置信息(包括 Client Secret)
- 保存配置到 `.env.oauth` 文件

**部署后输出示例:**

```
================================================
🎉 部署配置信息
================================================

📡 API 端点:
   https://xxxxx.execute-api.us-east-1.amazonaws.com/prod/mcp

🔐 OAuth 认证配置:
   Client ID:     xxxxxxxxxxxxxxxxxxxxx
   Client Secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   Token URL:     https://xxxxx.auth.us-east-1.amazoncognito.com/oauth2/token
   Scopes:        athena-mcp-api/read athena-mcp-api/write

🏢 AWS 资源:
   User Pool ID:  us-east-1_xxxxx
   Function ARN:  arn:aws:lambda:us-east-1:xxxxx:function:xxxxx
```

**测试部署:**

```bash
# 测试 OAuth 认证
./test-cognito-auth.sh

# 测试查询执行
./test-oauth-query.sh "SELECT * FROM my_table LIMIT 5" "my_database"
```

**手动获取配置(如果需要):**

```bash
# Get Client ID and Token URL from CloudFormation outputs
aws cloudformation describe-stacks --stack-name aws-athena-mcp-stack \
  --query "Stacks[0].Outputs"

# Get Client Secret
aws cognito-idp describe-user-pool-client \
  --user-pool-id <USER_POOL_ID> \
  --client-id <CLIENT_ID> \
  --query "UserPoolClient.ClientSecret" \
  --output text
```

**Client Integration:**

```typescript
// See examples/oauth-client-example.ts for full implementation
import { AthenaMcpClient } from './examples/oauth-client-example';

const client = new AthenaMcpClient({
  clientId: process.env.COGNITO_CLIENT_ID!,
  clientSecret: process.env.COGNITO_CLIENT_SECRET!,
  tokenUrl: process.env.COGNITO_TOKEN_URL!,
  apiEndpoint: process.env.API_ENDPOINT!,
});

await client.initialize();
const result = await client.runQuery('my_db', 'SELECT * FROM my_table LIMIT 10');
```

For detailed OAuth setup instructions, see [OAUTH-SETUP-GUIDE.md](./OAUTH-SETUP-GUIDE.md).

---

## Available Tools

The server provides the following tools:

- `run_query`: Execute a SQL query using AWS Athena
  - Parameters:
    - database: The Athena database to query
    - query: SQL query to execute
    - maxRows: Maximum number of rows to return (default: 1000, max: 10000)
  - Returns:
    - If query completes within timeout: Full query results
    - If timeout reached: Only the queryExecutionId for later retrieval

- `get_status`: Check the status of a query execution
  - Parameters:
    - queryExecutionId: The ID returned from run_query
  - Returns:
    - state: Query state (QUEUED, RUNNING, SUCCEEDED, FAILED, or CANCELLED)
    - stateChangeReason: Reason for state change (if any)
    - submissionDateTime: When the query was submitted
    - completionDateTime: When the query completed (if finished)
    - statistics: Query execution statistics (if available)

- `get_result`: Retrieve results for a completed query
  - Parameters:
    - queryExecutionId: The ID returned from run_query
    - maxRows: Maximum number of rows to return (default: 1000, max: 10000)
  - Returns:
    - Full query results if the query has completed successfully
    - Error if query failed or is still running

- `list_saved_queries`: List all saved (named) queries in Athena.

- Returns:
  - An array of saved queries with `id`, `name`, and optional `description`
  - Queries are returned from the configured `ATHENA_WORKGROUP` and `AWS_REGION`

- run_saved_query: Run a previously saved query by its ID.
- Parameters:
  - `namedQueryId`: ID of the saved query
  - `databaseOverride`: Optional override of the saved query's default database
  - `maxRows`: Maximum number of rows to return (default: 1000)
  - `timeoutMs`: Timeout in milliseconds (default: 60000)
- Returns:
  - Same behavior as `run_query`: full results or execution ID

---

## Usage Examples

### Show All Databases
Message to AI Assistant:
```List all databases in Athena```

MCP parameter:
```json
{
  "database": "default",
  "query": "SHOW DATABASES"
}
```

### List Tables in a Database
Message to AI Assistant:
```Show me all tables in the default database```

MCP parameter:
```json
{
  "database": "default",
  "query": "SHOW TABLES"
}
```

### Get Table Schema
Message to AI Assistant:
```What's the schema of the asin_sitebestimg table?```

MCP parameter:
```json
{
  "database": "default",
  "query": "DESCRIBE default.asin_sitebestimg"
}
```

### Table Rows Preview
Message to AI Assistant:
```Show some rows from my_database.mytable```

MCP parameter:
```json
{
  "database": "my_database",
  "query": "SELECT * FROM my_table LIMIT 10",
  "maxRows": 10
}
```

### Advanced Query with Filtering and Aggregation
Message to AI Assistant:
```Find the average price by category for in-stock products```

MCP parameter:
```json
{
  "database": "my_database",
  "query": "SELECT category, COUNT(*) as count, AVG(price) as avg_price FROM products WHERE in_stock = true GROUP BY category ORDER BY count DESC",
  "maxRows": 100
}
```

### Checking Query Status
```json
{
  "queryExecutionId": "12345-67890-abcdef"
}
```

### Getting Results for a Completed Query
```json
{
  "queryExecutionId": "12345-67890-abcdef",
  "maxRows": 10
}
```

### Listing Saved Queries
```json
{
  "name": "list_saved_queries",
  "arguments": {}
}
```

### Running a Saved Query
```json
{
  "name": "run_saved_query",
  "arguments": {
    "namedQueryId": "abcd-1234-efgh-5678",
    "maxRows": 100
  }
}
```

---

## Requirements

- Node.js >= 16
- AWS credentials with appropriate Athena and S3 permissions
- S3 bucket for query results
- Named queries (optional) must exist in the specified `ATHENA_WORKGROUP` and `AWS_REGION`

---

## License

MIT

## Repository

[GitHub Repository](https://github.com/lishenxydlgzs/aws-athena-mcp)

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a distinct purpose: get_result retrieves query results, get_status checks query status, list_saved_queries lists saved queries, run_query executes a new SQL query, and run_saved_query executes a saved query. There is no overlap or ambiguity between these functions.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (e.g., get_result, get_status, list_saved_queries, run_query, run_saved_query). The naming is uniform and predictable across all tools.

Tool Count5/5

With 5 tools, the server is well-scoped for AWS Athena operations. Each tool serves a clear purpose in the query lifecycle, from execution to result retrieval, without being overly complex or sparse.

Completeness5/5

The tool set covers the full CRUD/lifecycle for Athena queries: creating/executing queries (run_query, run_saved_query), reading results and status (get_result, get_status), and listing saved queries (list_saved_queries). There are no obvious gaps for the domain.

Maintenance

ActivityInactive
ResponsivenessNo issues