Skip to content

Commit c66388f

Browse files
committed
Fix tool test in UI and other changes
Signed-off-by: Madhav Kandukuri <[email protected]>
1 parent 71cd198 commit c66388f

File tree

6 files changed

+36
-10
lines changed

6 files changed

+36
-10
lines changed

mcpgateway/cache/session_registry.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ async def respond(
407407
server_id: Optional[str],
408408
user: json,
409409
session_id: str,
410+
base_url: str,
410411
) -> None:
411412
"""Respond to broadcast message is transport relevant to session_id is found locally
412413
@@ -425,7 +426,7 @@ async def respond(
425426
transport = self.get_session_sync(session_id)
426427
if transport:
427428
message = json.loads(self._session_message.get("message"))
428-
await self.generate_response(message=message, transport=transport, server_id=server_id, user=user)
429+
await self.generate_response(message=message, transport=transport, server_id=server_id, user=user, base_url=base_url)
429430

430431
elif self._backend == "redis":
431432
await self._pubsub.subscribe(session_id)
@@ -440,7 +441,7 @@ async def respond(
440441
message = json.loads(message)
441442
transport = self.get_session_sync(session_id)
442443
if transport:
443-
await self.generate_response(message=message, transport=transport, server_id=server_id, user=user)
444+
await self.generate_response(message=message, transport=transport, server_id=server_id, user=user, base_url=base_url)
444445
except asyncio.CancelledError:
445446
logger.info(f"PubSub listener for session {session_id} cancelled")
446447
finally:
@@ -494,7 +495,7 @@ async def message_check_loop(session_id):
494495
transport = self.get_session_sync(session_id)
495496
if transport:
496497
logger.info("Ready to respond")
497-
await self.generate_response(message=message, transport=transport, server_id=server_id, user=user)
498+
await self.generate_response(message=message, transport=transport, server_id=server_id, user=user, base_url=base_url)
498499

499500
await asyncio.to_thread(_db_remove, session_id, record.message)
500501

@@ -671,7 +672,7 @@ async def handle_initialize_logic(self, body: dict) -> InitializeResult:
671672
instructions=("MCP Gateway providing federated tools, resources and prompts. Use /admin interface for configuration."),
672673
)
673674

674-
async def generate_response(self, message: json, transport: SSETransport, server_id: Optional[str], user: dict):
675+
async def generate_response(self, message: json, transport: SSETransport, server_id: Optional[str], user: dict, base_url: str):
675676
"""
676677
Generates response according to SSE specifications
677678
@@ -745,9 +746,10 @@ async def generate_response(self, message: json, transport: SSETransport, server
745746
"id": 1,
746747
}
747748
headers = {"Authorization": f"Bearer {user['token']}", "Content-Type": "application/json"}
749+
rpc_url = base_url + "/rpc"
748750
async with httpx.AsyncClient(timeout=settings.federation_timeout, verify=not settings.skip_ssl_verify) as client:
749751
rpc_response = await client.post(
750-
f"http://localhost:{settings.port}/rpc",
752+
url=rpc_url,
751753
json=rpc_input,
752754
headers=headers,
753755
)

mcpgateway/db.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,3 +1086,6 @@ def init_db():
10861086
Base.metadata.create_all(bind=engine)
10871087
except SQLAlchemyError as e:
10881088
raise Exception(f"Failed to initialize database: {str(e)}")
1089+
1090+
if __name__ == "__main__":
1091+
init_db()

mcpgateway/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ async def sse_endpoint(request: Request, server_id: int, user: str = Depends(req
620620
await session_registry.add_session(transport.session_id, transport)
621621
response = await transport.create_sse_response(request)
622622

623-
asyncio.create_task(session_registry.respond(server_id, user, session_id=transport.session_id))
623+
asyncio.create_task(session_registry.respond(server_id, user, session_id=transport.session_id, base_url=base_url))
624624

625625
tasks = BackgroundTasks()
626626
tasks.add_task(session_registry.remove_session, transport.session_id)
@@ -1744,7 +1744,7 @@ async def utility_sse_endpoint(request: Request, user: str = Depends(require_aut
17441744
await transport.connect()
17451745
await session_registry.add_session(transport.session_id, transport)
17461746

1747-
asyncio.create_task(session_registry.respond(None, user, session_id=transport.session_id))
1747+
asyncio.create_task(session_registry.respond(None, user, session_id=transport.session_id, base_url=base_url))
17481748

17491749
response = await transport.create_sse_response(request)
17501750
tasks = BackgroundTasks()

mcpgateway/static/admin.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ document.addEventListener("DOMContentLoaded", function () {
218218
if (mode === "ui") {
219219
window.schemaEditor.setValue(generateSchema());
220220
}
221-
// Save CodeMirror editors' contents into the underlying textareas
221+
// Save CodeMirror editors contents into the underlying textareas
222222
if (window.headersEditor) {
223223
window.headersEditor.save();
224224
}
@@ -1579,7 +1579,15 @@ async function runToolTest() {
15791579
const formData = new FormData(form);
15801580
const params = {};
15811581
for (const [key, value] of formData.entries()) {
1582-
params[key] = value;
1582+
if(isNaN(value)) {
1583+
if(value.toLowerCase() === "true" || value.toLowerCase() === "false") {
1584+
params[key] = Boolean(value.toLowerCase() === "true");
1585+
} else {
1586+
params[key] = value;
1587+
}
1588+
} else {
1589+
params[key] = Number(value);
1590+
}
15831591
}
15841592

15851593
// Build the JSON-RPC payload using the tool's name as the method
@@ -1591,7 +1599,7 @@ async function runToolTest() {
15911599
};
15921600

15931601
// Send the request to your /rpc endpoint
1594-
fetch("/rpc", {
1602+
fetch(`${window.ROOT_PATH}/rpc`, {
15951603
method: "POST",
15961604
headers: {
15971605
"Content-Type": "application/json", // ← make sure we include this

pyproject.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,16 @@ postgres = [
7575
"psycopg2-binary>=2.9.10",
7676
]
7777

78+
# Async SQLite Driver (optional)
79+
aiosqlite = [
80+
"aiosqlite>=0.21.0",
81+
]
82+
83+
# Async PostgreSQL driver (optional)
84+
asyncpg = [
85+
"asyncpg>=0.30.0",
86+
]
87+
7888
# Optional dependency groups (development)
7989
dev = [
8090
"argparse-manpage>=4.6",

run-gunicorn.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ if [[ "${SSL}" == "true" ]]; then
3636
echo "✓ TLS enabled – using ${CERT_FILE} / ${KEY_FILE}"
3737
fi
3838

39+
# Initialize databases
40+
python -m mcpgateway.db
41+
3942
exec gunicorn -c gunicorn.config.py \
4043
--worker-class uvicorn.workers.UvicornWorker \
4144
--workers "${GUNICORN_WORKERS}" \

0 commit comments

Comments
 (0)