diff --git a/morpheus-graphql-app.cabal b/morpheus-graphql-app.cabal
--- a/morpheus-graphql-app.cabal
+++ b/morpheus-graphql-app.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           morpheus-graphql-app
-version:        0.22.1
+version:        0.23.0
 synopsis:       Morpheus GraphQL App
 description:    Build GraphQL APIs with your favourite functional language!
 category:       web, graphql
@@ -38,6 +38,10 @@
     test/api/validation/fragment/on-type/query.gql
     test/api/validation/fragment/on-union-type/query.gql
     test/api/validation/fragment/schema.gql
+    test/api/validation/input-coercion/list/list-many/query.gql
+    test/api/validation/input-coercion/list/list-single/query.gql
+    test/api/validation/input-coercion/list/schema.gql
+    test/api/validation/input-coercion/list/signle-value/query.gql
     test/merge/schema/query-subscription-mutation/app-1.gql
     test/merge/schema/query-subscription-mutation/app-2.gql
     test/merge/schema/query-subscription-mutation/mutation/query.gql
@@ -78,6 +82,10 @@
     test/api/validation/fragment/on-type/response.json
     test/api/validation/fragment/on-union-type/response.json
     test/api/validation/fragment/resolvers.json
+    test/api/validation/input-coercion/list/list-many/response.json
+    test/api/validation/input-coercion/list/list-single/response.json
+    test/api/validation/input-coercion/list/resolvers.json
+    test/api/validation/input-coercion/list/signle-value/response.json
     test/merge/schema/query-subscription-mutation/app-1.json
     test/merge/schema/query-subscription-mutation/app-2.json
     test/merge/schema/query-subscription-mutation/mutation/response.json
@@ -132,7 +140,7 @@
     , containers >=0.4.2.1 && <0.7.0
     , hashable >=1.0.0 && <2.0.0
     , megaparsec >=7.0.0 && <10.0.0
-    , morpheus-graphql-core >=0.22.0 && <0.23.0
+    , morpheus-graphql-core >=0.23.0 && <0.24.0
     , mtl >=2.0.0 && <3.0.0
     , relude >=0.3.0 && <2.0.0
     , scientific >=0.3.6.2 && <0.4.0
@@ -163,8 +171,8 @@
     , hashable >=1.0.0 && <2.0.0
     , megaparsec >=7.0.0 && <10.0.0
     , morpheus-graphql-app
-    , morpheus-graphql-core >=0.22.0 && <0.23.0
-    , morpheus-graphql-tests >=0.22.0 && <0.23.0
+    , morpheus-graphql-core >=0.23.0 && <0.24.0
+    , morpheus-graphql-tests >=0.23.0 && <0.24.0
     , mtl >=2.0.0 && <3.0.0
     , relude >=0.3.0 && <2.0.0
     , scientific >=0.3.6.2 && <0.4.0
diff --git a/src/Data/Morpheus/App/Internal/Resolving/Utils.hs b/src/Data/Morpheus/App/Internal/Resolving/Utils.hs
--- a/src/Data/Morpheus/App/Internal/Resolving/Utils.hs
+++ b/src/Data/Morpheus/App/Internal/Resolving/Utils.hs
@@ -21,6 +21,7 @@
 
 import Control.Monad.Except (MonadError (throwError))
 import qualified Data.Aeson as A
+import Data.Morpheus.App.Internal.Resolving.ResolverState
 import Data.Morpheus.App.Internal.Resolving.Types
   ( NamedResolverRef (..),
     ObjectTypeResolver (..),
@@ -41,14 +42,23 @@
     packName,
     unpackName,
   )
+import Data.Morpheus.Types.SelectionTree (SelectionTree (..))
+import Data.Text (breakOnEnd, splitOn)
 import qualified Data.Vector as V
-import Relude
+import Relude hiding (break)
 
-lookupResJSON :: (MonadError GQLError f, Monad m) => FieldName -> A.Value -> f (ObjectTypeResolver m)
+lookupResJSON ::
+  ( MonadError GQLError f,
+    MonadReader ResolverContext f,
+    MonadReader ResolverContext m
+  ) =>
+  FieldName ->
+  A.Value ->
+  f (ObjectTypeResolver m)
 lookupResJSON name (A.Object fields) =
   selectOr
     mkEmptyObject
-    (requireObject . mkValue)
+    (requireObject <=< mkValue)
     (unpackName name)
     fields
 lookupResJSON _ _ = mkEmptyObject
@@ -57,20 +67,35 @@
 mkEmptyObject = pure $ ObjectTypeResolver mempty
 
 mkValue ::
-  (Monad m) =>
+  ( MonadReader ResolverContext f,
+    MonadReader ResolverContext m
+  ) =>
   A.Value ->
-  ResolverValue m
-mkValue (A.Object v) =
-  mkObjectMaybe
-    (U.lookup "__typename" v >>= unpackJSONName)
-    $ fmap
-      (bimap packName (pure . mkValue))
-      (toAssoc v)
-mkValue (A.Array ls) = mkList (fmap mkValue (V.toList ls))
-mkValue A.Null = mkNull
-mkValue (A.Number x) = ResScalar (decodeScientific x)
-mkValue (A.String x) = ResScalar (String x)
-mkValue (A.Bool x) = ResScalar (Boolean x)
+  f (ResolverValue m)
+mkValue (A.Object v) = pure $ mkObjectMaybe typename fields
+  where
+    typename = U.lookup "__typename" v >>= unpackJSONName
+    fields = map (bimap packName mkValue) (toAssoc v)
+mkValue (A.Array ls) = mkList <$> traverse mkValue (V.toList ls)
+mkValue A.Null = pure mkNull
+mkValue (A.Number x) = pure $ ResScalar (decodeScientific x)
+mkValue (A.String txt) = case withSelf txt of
+  ARG name -> do
+    sel <- asks currentSelection
+    mkValue (fromMaybe A.Null (getArgument name sel))
+  NoAPI v -> pure $ ResScalar (String v)
+mkValue (A.Bool x) = pure $ ResScalar (Boolean x)
+
+data SelfAPI
+  = ARG Text
+  | NoAPI Text
+
+withSelf :: Text -> SelfAPI
+withSelf txt = case breakOnEnd "::" txt of
+  ("@SELF::", field) -> case splitOn "." field of
+    ["ARG", name] -> ARG name
+    _ -> NoAPI txt
+  _ -> NoAPI txt
 
 requireObject :: MonadError GQLError f => ResolverValue m -> f (ObjectTypeResolver m)
 requireObject (ResObject _ x) = pure x
diff --git a/test/api/validation/input-coercion/list/list-many/query.gql b/test/api/validation/input-coercion/list/list-many/query.gql
new file mode 100644
--- /dev/null
+++ b/test/api/validation/input-coercion/list/list-many/query.gql
@@ -0,0 +1,3 @@
+query {
+  foo(bar: [3, 124, 5, 6])
+}
diff --git a/test/api/validation/input-coercion/list/list-many/response.json b/test/api/validation/input-coercion/list/list-many/response.json
new file mode 100644
--- /dev/null
+++ b/test/api/validation/input-coercion/list/list-many/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "foo": [3, 124, 5, 6]
+  }
+}
diff --git a/test/api/validation/input-coercion/list/list-single/query.gql b/test/api/validation/input-coercion/list/list-single/query.gql
new file mode 100644
--- /dev/null
+++ b/test/api/validation/input-coercion/list/list-single/query.gql
@@ -0,0 +1,3 @@
+query {
+  foo(bar: [3])
+}
diff --git a/test/api/validation/input-coercion/list/list-single/response.json b/test/api/validation/input-coercion/list/list-single/response.json
new file mode 100644
--- /dev/null
+++ b/test/api/validation/input-coercion/list/list-single/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "foo": [3]
+  }
+}
diff --git a/test/api/validation/input-coercion/list/resolvers.json b/test/api/validation/input-coercion/list/resolvers.json
new file mode 100644
--- /dev/null
+++ b/test/api/validation/input-coercion/list/resolvers.json
@@ -0,0 +1,5 @@
+{
+  "query": {
+    "foo": "@SELF::ARG.bar"
+  }
+}
diff --git a/test/api/validation/input-coercion/list/schema.gql b/test/api/validation/input-coercion/list/schema.gql
new file mode 100644
--- /dev/null
+++ b/test/api/validation/input-coercion/list/schema.gql
@@ -0,0 +1,3 @@
+type Query {
+  foo(bar: [Int!]): Int!
+}
diff --git a/test/api/validation/input-coercion/list/signle-value/query.gql b/test/api/validation/input-coercion/list/signle-value/query.gql
new file mode 100644
--- /dev/null
+++ b/test/api/validation/input-coercion/list/signle-value/query.gql
@@ -0,0 +1,3 @@
+query {
+  foo(bar: 3)
+}
diff --git a/test/api/validation/input-coercion/list/signle-value/response.json b/test/api/validation/input-coercion/list/signle-value/response.json
new file mode 100644
--- /dev/null
+++ b/test/api/validation/input-coercion/list/signle-value/response.json
@@ -0,0 +1,5 @@
+{
+  "data": {
+    "foo": [3]
+  }
+}
