From e71fc9562948bb290d8a05f1c51d1245383f2834 Mon Sep 17 00:00:00 2001 From: Diego Restrepo Date: Sun, 27 Jul 2025 10:56:13 -0500 Subject: [PATCH] feat(graphql): enhance GraphQL input type handling - Updated logging configuration to silence INFO logs from the gql AIOHTTP transport. - Enhanced the `convert_type_to_json_schema` function to support `GraphQLInputObjectType` and `GraphQLInputField`. - Added error logging for unknown GraphQL types to improve debugging capabilities. --- mcp_graphql/server.py | 20 +++++++++++++++++--- nix/pkgs/deploy/default.nix | 3 ++- pyproject.toml | 4 ++-- uv.lock | 2 +- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/mcp_graphql/server.py b/mcp_graphql/server.py index d0d1c0a..c76a742 100644 --- a/mcp_graphql/server.py +++ b/mcp_graphql/server.py @@ -3,7 +3,7 @@ from collections.abc import AsyncIterator from contextlib import asynccontextmanager from functools import partial -from logging import INFO, basicConfig, getLogger +from logging import INFO, WARNING, basicConfig, getLogger from typing import Any, cast from gql import Client @@ -14,6 +14,8 @@ GraphQLArgumentMap, GraphQLEnumType, GraphQLField, + GraphQLInputField, + GraphQLInputObjectType, GraphQLInputType, GraphQLInterfaceType, GraphQLList, @@ -50,6 +52,8 @@ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", ) logger = getLogger(__name__) +# Silence INFO logs from the gql AIOHTTP transport +getLogger("gql.transport.aiohttp").setLevel(WARNING) class UnknownGraphQLTypeError(Exception): @@ -103,7 +107,7 @@ def _convert_scalar_to_json_schema(gql_scalar: GraphQLScalarType) -> JsonSchema: return {"type": "string", "description": f"GraphQL scalar: {gql_scalar!s}"} -def convert_type_to_json_schema( +def convert_type_to_json_schema( # noqa: C901 gql_type: GraphQLInputType | GraphQLArgument, max_depth: int = 3, current_depth: int = 1, @@ -176,9 +180,19 @@ def convert_type_to_json_schema( schema = convert_type_to_json_schema(gql_type.type) if gql_type.description is not None: schema["description"] = gql_type.description - + elif isinstance(gql_type, GraphQLInputObjectType): + schema = { + "type": "object", + "properties": { + field_name: convert_type_to_json_schema(field_type) + for field_name, field_type in gql_type.fields.items() + }, + } + elif isinstance(gql_type, GraphQLInputField): + schema = convert_type_to_json_schema(gql_type.type) else: # Unknown / unsupported + logger.error("Unknown GraphQL type: %s", gql_type.__class__.__name__) raise UnknownGraphQLTypeError(gql_type) return schema diff --git a/nix/pkgs/deploy/default.nix b/nix/pkgs/deploy/default.nix index f572e7f..9a84086 100644 --- a/nix/pkgs/deploy/default.nix +++ b/nix/pkgs/deploy/default.nix @@ -3,13 +3,14 @@ pkgs.writeShellApplication { name = "mcp_graphql-deploy"; runtimeInputs = pkgs.lib.flatten [ pkgs.uv + pkgs.sops lib'.envs.default ]; text = '' pyproject_toml="pyproject.toml" if ! git diff HEAD~1 HEAD -- "''${pyproject_toml}" | grep -q '^[-+]version'; then - : && info "''${pyproject_toml} version has not changed. Skipping deployment." \ + echo "''${pyproject_toml} version has not changed. Skipping deployment." \ && return 0 fi diff --git a/pyproject.toml b/pyproject.toml index 9f22671..b234eb0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "mcp-graphql" -version = "0.3.1" -description = "Add your description here" +version = "0.3.2" +description = "MCP server for GraphQL" readme = "README.md" requires-python = ">=3.11" dependencies = [ diff --git a/uv.lock b/uv.lock index aca0c78..9902a8d 100644 --- a/uv.lock +++ b/uv.lock @@ -387,7 +387,7 @@ cli = [ [[package]] name = "mcp-graphql" -version = "0.3.0" +version = "0.3.2" source = { editable = "." } dependencies = [ { name = "aiohttp" },