We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jermeyyy/gradle-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Gradle MCP Dashboard{% endblock %}</title>
<style>
/* CSS Variables for theming */
:root {
--bg-primary: #1e1e1e;
--bg-secondary: #252526;
--bg-tertiary: #2d2d2d;
--bg-hover: #3c3c3c;
--text-primary: #cccccc;
--text-secondary: #9d9d9d;
--text-muted: #6d6d6d;
--accent-blue: #569cd6;
--accent-green: #4ec9b0;
--accent-orange: #ce9178;
--accent-red: #f14c4c;
--accent-yellow: #dcdcaa;
--border-color: #3c3c3c;
--card-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
/* Reset and base styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
min-height: 100vh;
}
/* Header icon */
.header-icon {
height: 28px;
width: auto;
vertical-align: middle;
margin-right: 8px;
}
/* SVG Icons */
.icon {
display: inline-block;
width: 16px;
height: 16px;
vertical-align: middle;
margin-right: 4px;
}
.icon-large {
width: 48px;
height: 48px;
margin-bottom: 15px;
}
.icon-build {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dcdcaa' stroke-width='2'%3E%3Cpath d='M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z'/%3E%3C/svg%3E") no-repeat center;
background-size: contain;
}
.icon-daemon {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23569cd6' stroke-width='2'%3E%3Crect x='4' y='4' width='16' height='16' rx='2' ry='2'/%3E%3Crect x='9' y='9' width='6' height='6'/%3E%3Cline x1='9' y1='1' x2='9' y2='4'/%3E%3Cline x1='15' y1='1' x2='15' y2='4'/%3E%3Cline x1='9' y1='20' x2='9' y2='23'/%3E%3Cline x1='15' y1='20' x2='15' y2='23'/%3E%3Cline x1='20' y1='9' x2='23' y2='9'/%3E%3Cline x1='20' y1='14' x2='23' y2='14'/%3E%3Cline x1='1' y1='9' x2='4' y2='9'/%3E%3Cline x1='1' y1='14' x2='4' y2='14'/%3E%3C/svg%3E") no-repeat center;
background-size: contain;
}
.icon-logs {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239d9d9d' stroke-width='2'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cline x1='16' y1='13' x2='8' y2='13'/%3E%3Cline x1='16' y1='17' x2='8' y2='17'/%3E%3Cpolyline points='10 9 9 9 8 9'/%3E%3C/svg%3E") no-repeat center;
background-size: contain;
}
.icon-stop {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23f14c4c'%3E%3Crect x='6' y='6' width='12' height='12' rx='1'/%3E%3C/svg%3E") no-repeat center;
background-size: contain;
}
.icon-check {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234ec9b0' stroke-width='2'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") no-repeat center;
background-size: contain;
}
.icon-warning {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dcdcaa' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/%3E%3Cline x1='12' y1='9' x2='12' y2='13'/%3E%3Ccircle cx='12' cy='17' r='0.5' fill='%23dcdcaa'/%3E%3C/svg%3E") no-repeat center;
background-size: contain;
}
.icon-loading {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236d6d6d' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 6v6l4 2'/%3E%3C/svg%3E") no-repeat center;
background-size: contain;
animation: spin 2s linear infinite;
}
.icon-sleep {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236d6d6d' stroke-width='2'%3E%3Cpath d='M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z'/%3E%3C/svg%3E") no-repeat center;
background-size: contain;
}
.icon-empty {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236d6d6d' stroke-width='2'%3E%3Cpath d='M22 12h-4l-3 9L9 3l-3 9H2'/%3E%3C/svg%3E") no-repeat center;
background-size: contain;
}
/* Container */
.container {
max-width: 1400px;
margin: 0 auto;
padding: 20px 20px 0px 20px;
}
/* Header */
header {
background-color: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
padding: 15px 0;
margin-bottom: 20px;
}
header .container {
display: flex;
justify-content: space-between;
align-items: center;
}
header h1 {
font-size: 1.5rem;
font-weight: 500;
color: var(--text-primary);
display: flex;
align-items: center;
}
/* Cards */
.card {
background-color: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 6px;
margin-bottom: 20px;
box-shadow: var(--card-shadow);
}
.card-header {
padding: 15px 20px;
border-bottom: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
align-items: center;
}
.card-header h2 {
font-size: 1.1rem;
font-weight: 500;
color: var(--text-primary);
}
.card-body {
padding: 20px;
}
/* Tables */
table {
width: 100%;
border-collapse: collapse;
}
th, td {
text-align: left;
padding: 12px 15px;
border-bottom: 1px solid var(--border-color);
}
th {
background-color: var(--bg-tertiary);
color: var(--text-secondary);
font-weight: 500;
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 0.05em;
}
tr:hover {
background-color: var(--bg-hover);
}
tr:last-child td {
border-bottom: none;
}
/* Buttons */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 8px 16px;
border: none;
border-radius: 4px;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: background-color 0.2s, opacity 0.2s;
text-decoration: none;
}
.btn:hover {
opacity: 0.9;
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.btn-primary {
background-color: var(--accent-blue);
color: white;
}
.btn-danger {
background-color: var(--accent-red);
color: white;
}
.btn-secondary {
background-color: var(--bg-tertiary);
color: var(--text-primary);
border: 1px solid var(--border-color);
}
.btn-sm {
padding: 5px 10px;
font-size: 0.8rem;
}
/* Status badges */
.badge {
display: inline-block;
padding: 3px 8px;
border-radius: 3px;
font-size: 0.75rem;
font-weight: 500;
text-transform: uppercase;
}
.badge-idle {
background-color: rgba(78, 201, 176, 0.2);
color: var(--accent-green);
}
.badge-busy {
background-color: rgba(220, 220, 170, 0.2);
color: var(--accent-yellow);
}
.badge-stopped {
background-color: rgba(157, 157, 157, 0.2);
color: var(--text-secondary);
}
/* Empty state */
.empty-state {
text-align: center;
padding: 40px 20px;
color: var(--text-muted);
}
.empty-state-icon {
font-size: 3rem;
margin-bottom: 15px;
}
/* Utilities */
.text-muted {
color: var(--text-muted);
}
.text-small {
font-size: 0.85rem;
}
.mt-2 {
margin-top: 0.5rem;
}
.mt-3 {
margin-top: 0.75rem;
}
.mt-4 {
margin-top: 1rem;
}
.mb-4 {
margin-bottom: 1rem;
}
.text-center {
text-align: center;
}
/* Logs preview styles */
.logs-preview {
background-color: var(--bg-tertiary);
border-radius: 4px;
padding: 10px;
max-height: 300px;
overflow-y: auto;
font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;
font-size: 0.8rem;
}
.log-entry-preview {
display: flex;
align-items: flex-start;
padding: 4px 0;
border-bottom: 1px solid rgba(60, 60, 60, 0.5);
}
.log-entry-preview:last-child {
border-bottom: none;
}
.log-time {
color: var(--text-muted);
margin-right: 10px;
flex-shrink: 0;
min-width: 70px;
}
.log-level-badge {
margin-right: 10px;
flex-shrink: 0;
min-width: 45px;
font-weight: 500;
font-size: 0.7rem;
}
.log-level-debug {
color: var(--text-muted);
}
.log-level-info {
color: var(--accent-blue);
}
.log-level-warn {
color: var(--accent-yellow);
}
.log-level-error {
color: var(--accent-red);
}
.log-msg {
color: var(--text-primary);
word-break: break-word;
white-space: pre-wrap;
}
/* Active builds styles */
.build-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.build-card {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 20px;
background-color: var(--bg-tertiary);
border: 1px solid var(--accent-yellow);
border-left: 4px solid var(--accent-yellow);
border-radius: 6px;
}
.build-info {
display: flex;
align-items: center;
gap: 15px;
}
.build-daemon {
color: var(--text-secondary);
}
.build-version {
color: var(--text-muted);
font-size: 0.85rem;
}
.build-actions {
display: flex;
gap: 8px;
}
/* Loading spinner */
.spinner {
display: inline-block;
width: 16px;
height: 16px;
border: 2px solid var(--text-muted);
border-radius: 50%;
border-top-color: var(--accent-blue);
animation: spin 1s linear infinite;
margin-right: 8px;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* Responsive */
@media (max-width: 768px) {
.container {
padding: 10px;
}
th, td {
padding: 10px;
font-size: 0.9rem;
}
.btn {
padding: 6px 12px;
}
}
{% block extra_styles %}{% endblock %}
</style>
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
</head>
<body>
{% block content %}{% endblock %}
{% block scripts %}{% endblock %}
</body>
</html>