shesadri/spring-ai-mcp-poc
If you are the rightful owner of spring-ai-mcp-poc and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
This repository provides a Docker-based setup for running a GitHub Model Context Protocol (MCP) server locally, designed for integration with Spring AI applications.
Spring AI MCP Proof of Concept
This repository contains a Docker-based setup for running a GitHub Model Context Protocol (MCP) server locally. It's designed to work with Spring AI applications and provides a standardized way to interact with GitHub APIs through the MCP protocol.
Features
- GitHub MCP Server: A containerized MCP server that provides GitHub API access
- RESTful API: HTTP endpoints for easy integration with Spring AI applications
- Docker Compose: Simple local deployment with Docker
- Health Monitoring: Built-in health checks and monitoring
- Development Ready: Hot-reload and development-friendly configuration
Prerequisites
- Docker and Docker Compose installed
- GitHub Personal Access Token with appropriate scopes
- Node.js 18+ (for local development)
Quick Start
1. Clone the Repository
git clone https://github.com/shesadri/spring-ai-mcp-poc.git
cd spring-ai-mcp-poc
2. Set Up Environment Variables
cp .env.example .env
Edit the .env
file and add your GitHub Personal Access Token:
GITHUB_PERSONAL_ACCESS_TOKEN=your_github_token_here
MCP_SERVER_PORT=3000
NODE_ENV=development
3. Generate GitHub Token
- Go to GitHub Settings > Developer settings > Personal access tokens
- Click "Generate new token (classic)"
- Select the following scopes:
repo
(Full control of private repositories)read:user
(Read user profile data)read:org
(Read organization data)
- Copy the generated token to your
.env
file
4. Start the Services
docker-compose up -d
This will start:
- GitHub MCP Server on port 3000
- Web UI (optional) on port 8080
5. Verify the Setup
Check if the server is running:
curl http://localhost:3000/health
You should see:
{
"status": "healthy",
"timestamp": "2025-06-01T04:22:00.000Z"
}
API Endpoints
The GitHub MCP server exposes the following REST API endpoints:
Repository Operations
- Get Repository:
GET /api/repos/{owner}/{repo}
- List User Repositories:
GET /api/users/{username}/repos?type={all|owner|member}
Issues Operations
- List Issues:
GET /api/repos/{owner}/{repo}/issues?state={open|closed|all}
- Create Issue:
POST /api/repos/{owner}/{repo}/issues
Pull Request Operations
- List Pull Requests:
GET /api/repos/{owner}/{repo}/pulls?state={open|closed|all}
Example API Calls
# Get repository information
curl http://localhost:3000/api/repos/octocat/Hello-World
# List user repositories
curl http://localhost:3000/api/users/octocat/repos
# List open issues
curl http://localhost:3000/api/repos/octocat/Hello-World/issues?state=open
# Create a new issue
curl -X POST http://localhost:3000/api/repos/octocat/Hello-World/issues \
-H "Content-Type: application/json" \
-d '{
"title": "Test issue",
"body": "This is a test issue created via MCP server",
"labels": ["bug", "help wanted"]
}'
# List pull requests
curl http://localhost:3000/api/repos/octocat/Hello-World/pulls
Integration with Spring AI
This MCP server can be integrated with Spring AI applications. Here's an example configuration:
Spring Boot Configuration
# application.yml
spring:
ai:
mcp:
servers:
github:
url: http://localhost:3000
enabled: true
timeout: 30s
Java Integration Example
@Service
public class GitHubMCPService {
@Value("${mcp.github.base-url:http://localhost:3000}")
private String baseUrl;
private final RestTemplate restTemplate;
public GitHubMCPService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public Repository getRepository(String owner, String repo) {
String url = baseUrl + "/api/repos/" + owner + "/" + repo;
return restTemplate.getForObject(url, Repository.class);
}
public List<Issue> getIssues(String owner, String repo, String state) {
String url = baseUrl + "/api/repos/" + owner + "/" + repo + "/issues?state=" + state;
return Arrays.asList(restTemplate.getForObject(url, Issue[].class));
}
public Issue createIssue(String owner, String repo, CreateIssueRequest request) {
String url = baseUrl + "/api/repos/" + owner + "/" + repo + "/issues";
return restTemplate.postForObject(url, request, Issue.class);
}
}
Development
Local Development Without Docker
- Create the server directory:
mkdir mcp-github-server
cd mcp-github-server
- Initialize the Node.js project:
npm init -y
npm install @modelcontextprotocol/sdk-nodejs @octokit/rest express cors dotenv
- Copy the server implementation from the docker-compose.yml
- Run locally:
npm start
Monitoring and Logs
View server logs:
docker-compose logs -f github-mcp-server
Check container status:
docker-compose ps
Configuration
Environment Variables
Variable | Description | Default |
---|---|---|
GITHUB_PERSONAL_ACCESS_TOKEN | GitHub PAT for API access | Required |
MCP_SERVER_PORT | Port for the MCP server | 3000 |
NODE_ENV | Node.js environment | development |
Docker Compose Services
- github-mcp-server: Main MCP server container
- mcp-web-ui: Optional web interface for testing
Troubleshooting
Common Issues
- Authentication Error: Make sure your GitHub token has the required scopes
- Port Conflicts: Change the
MCP_SERVER_PORT
in.env
if port 3000 is in use - Permission Denied: Ensure Docker has permission to bind to the specified ports
Debug Mode
Enable debug logging:
NODE_ENV=development docker-compose up
Security Considerations
- Never commit your
.env
file with real tokens - Use minimal required scopes for your GitHub token
- Consider using GitHub Apps for production deployments
- Implement rate limiting for production use
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Test with
docker-compose up
- Submit a pull request
License
This project is licensed under the MIT License - see the LICENSE file for details.