larksuite/cli · error
L1: inputSchema.type =
Error message
L1: inputSchema.type = %q, want "object"
What it means
lintEnvelope performs L1 structural validation of tool envelopes. Every tool must declare inputSchema with type exactly "object"; this error is appended when the declared type is anything else (or empty). This keeps all tool inputs as JSON objects, which the generic service machinery relies on.
Solutions
- Set inputSchema.type to "object" and place the actual parameters under inputSchema.properties (e.g. a params/data wrapper).
- Move non-object schema (string/array) down into a property's schema instead of the root.
- Re-run the lint after the fix to confirm no remaining L1 errors.
Example fix
// before
"inputSchema": { "type": "string" }
// after
"inputSchema": { "type": "object", "properties": { "params": { "type": "string" } } } Defensive patterns
Strategy: validation
Validate before calling
func inputSchemaIsObject(env map[string]any) bool {
s, ok := env["inputSchema"].(map[string]any)
return ok && s["type"] == "object"
} Type guard
func hasObjectInputSchema(env *Envelope) bool { return env.InputSchema != nil && env.InputSchema.Type == "object" } Try / catch
errs := lintEnvelope(env)
for _, e := range errs {
if strings.Contains(e.Error(), "inputSchema.type") {
// fix envelope: set type "object" and nest params under properties
}
} Prevention
- Start every tool envelope from a template with type "object" at the root.
- Nest parameter schemas under properties, never at the root level.
- Run the envelope lint in CI before publishing tool metadata.
When it happens
Trigger: Running the schema lint (TestLintEnvelope_Valid, TestAllEnvelopesPass, or envelope-lint tooling) on an envelope whose inputSchema.type is e.g. "string", "array", or omitted/mistyped.
Common situations: Hand-writing a new tool envelope and copying a parameter-level schema to the top level; forgetting the params/data wrapper object; a generator emitting a non-object root schema.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- L1: _meta.envelope_version =
- L1: outputSchema.type =
- L2: required key not found in properties
- L3: _meta.danger= inconsistent with risk=
- Args field (-- ): InputField.Shape conflicts with schema…
AI-assisted analysis of larksuite/cli@7fd6ef3c07 (2026-09-04).
Data as JSON: /api/errors/29f4c3fbf0c092ed.
Report an issue: GitHub.
Appendix: source
Thrown at internal/schema/lint.go:40
var validAccessTokens = map[string]bool{
"user": true,
"bot": true,
}
// lintEnvelope runs L1-L3 checks and returns a list of errors. Empty slice
// means the envelope is compliant.
func lintEnvelope(env Envelope) []error {
var errs []error
// ---- L1: structural ----
if env.Name == "" {
errs = append(errs, errors.New("L1: name must not be empty"))
}
if env.InputSchema == nil {
errs = append(errs, errors.New("L1: inputSchema must not be nil"))
} else {
if env.InputSchema.Type != "object" {
errs = append(errs, fmt.Errorf("L1: inputSchema.type = %q, want \"object\"", env.InputSchema.Type))
}
if env.InputSchema.Properties == nil {
errs = append(errs, errors.New("L1: inputSchema.properties must not be nil"))
}
}
if env.OutputSchema == nil {
errs = append(errs, errors.New("L1: outputSchema must not be nil"))
} else {
if env.OutputSchema.Type != "object" {
errs = append(errs, fmt.Errorf("L1: outputSchema.type = %q, want \"object\"", env.OutputSchema.Type))
}
}
if env.Meta == nil {
errs = append(errs, errors.New("L1: _meta must not be nil"))
// Cannot continue meta-dependent checks
return errs
}
if env.Meta.EnvelopeVersion != "1.0" {View on GitHub (pinned to 7fd6ef3c07)