Troubleshooting
August 1, 2026 · View on GitHub
Start with the public error code, request ID, current domain manifest, and the same request-specific Doris identity. Do not copy tokens, passwords, raw OAuth responses, or private model bindings into an issue.
First checks
doris-mcp-server --version
curl --fail http://127.0.0.1:3000/live
curl --verbose http://127.0.0.1:3000/ready
Record:
- package version and commit/image digest;
- transport and exposure mode;
- normalized Doris version and deployment mode;
- domain/child and public
reason_code; - request ID and timestamp;
- whether
/liveand/readydiffer; - whether the same Doris account can run a minimal equivalent read-only check.
Server does not start
Non-loopback bind without authentication
Symptom: startup refuses 0.0.0.0 or another non-loopback address.
Resolution: enable one reviewed authentication mode and deploy behind TLS with
validated Host/Origin. Use ALLOW_UNAUTHENTICATED_NON_LOOPBACK=true only for
isolated disposable testing.
Authentication modes conflict
External OAuth and Doris-backed OAuth cannot be active together. Select one trust model. Also verify required issuers, resources, keys, base URLs, proxy CIDRs, and secrets.
Doris OAuth rejects worker count
Doris-backed OAuth requires Streamable HTTP and WORKERS=1 in 1.0 because its
authorization and per-user pool state are process-local.
Administration-domain configuration is rejected
doris_admin is reserved and intentionally unavailable. Remove attempts to
enable it; there is no 1.0 management-tool bypass.
Custom provider fails startup
Every name in MCP_TOOL_PROVIDERS must resolve to an installed, valid entry
point with non-colliding bounded schemas. Remove the name or repair the
provider. Allowlisted provider failures are fail-closed by design.
/live works but /ready returns 503
The process is alive, but the bounded Doris readiness route failed.
Check:
- FE MySQL host/port and network policy.
- The configured database exists and is visible.
- Credentials and account lock/expiry.
- TLS/proxy requirements between Server and Doris.
- Pool exhaustion or repeated timeout disposal.
- Multi-FE candidates and whether at least one is healthy.
Test with the same account and network path. Do not treat a different admin
account's successful SELECT 1 as proof that the MCP identity works.
HTTP request rejected
Host or Origin denied
The bind address is not an allowlist. Confirm the actual Host and Origin
seen by the Server, reverse-proxy rewrites, TLS scheme, and trusted proxy CIDR.
Avoid globally trusting forwarded headers.
HeaderMismatch (-32020)
Ensure:
MCP-Protocol-Versionmatches_meta;Mcp-Methodexactly matches JSON-RPCmethod;Mcp-Namematches the tool/resource/prompt name or URI;Acceptincludes JSON and event-stream media types;- the proxy preserves these headers.
Unsupported protocol (-32022)
Use /mcp for MCP 2026-07-28. Validated 2025-06-18 clients such as Dify
1.16.1 and 2025-11-25 clients must use the explicitly enabled
/mcp/legacy endpoint. HTTP+SSE clients must migrate.
Authentication or authorization fails
401 authentication required
Confirm the credential type matches the enabled mode, the token is active and unexpired, issuer/audience/resource match, and the proxy does not remove the Authorization header.
403 insufficient scope
Read the exact required scope. A domain discovery grant does not imply a child call grant. Pre-1.0 names and wildcard guesses are invalid.
Child appears missing
An unauthorized child is intentionally indistinguishable from a nonexistent child. Re-run domain discovery under the same identity and verify exact discovery/call scopes and channel enablement.
Doris permission denied
MCP authorization may pass while Doris RBAC denies the actual object. Test the same SQL/metadata view with the same Doris account, then grant only the minimum required privilege. See the fine-grained access guide.
Domain discovery or child execution fails
CHILD_MANIFEST_STALE
Call the domain with {} again and use the new manifest. Route, permission,
provider, model, feature probe, or capability cache generation may have
changed.
CHILD_CAPABILITY_UNAVAILABLE
Use structured reason_code and evidence sources. Common causes:
- Doris version below the feature range;
- mixed or unknown active component versions;
- missing system table/function/index;
- disabled or unhealthy optional provider;
- unreadable metadata for the request account;
- incomplete lineage store;
- stale evidence outside its allowed window.
Call doris_cluster.get_runtime_capabilities when authorized. Do not edit the
description or force execution around callable=false.
Manifest over budget
This indicates catalog/provider/schema drift. Built-in manifests and flat tools have hard budgets. Regenerate/check the tool catalog and reduce provider descriptions/schemas; do not raise limits casually because Host context is a product contract.
Query failures
QUERY_READ_ONLY_VIOLATION
Submit one read-only statement. Remove DDL/DML/administration, stacked statements, unsafe comments, or unsupported query shape. The Query child is not an administrative SQL escape hatch.
QUERY_ARGUMENT_INVALID
Use the exact discovered schema. Validate identifier fields, parameter names and types, query target shape, requested format, and limits.
QUERY_TIMEOUT
Reduce scanned data, add predicates, use Explain/diagnosis, lower requested result volume, and inspect Doris workload state. Retry only when the error says it is retryable. A timed-out connection may be disposed intentionally.
Result truncated or too large
Use smaller pages, narrower columns, stronger filters, aggregation, or a lower limit. Do not increase process limits before estimating serialized response size and model context impact.
Profile unavailable
Check FE HTTP host/port, allowlist, route identity, profile retention, query ID, and the Doris account's visibility. A working MySQL route does not prove FE HTTP is configured.
Pagination and state handles
An invalid cursor can mean expiry, tampering, visibility change, principal change, wrong list type, different state secret, or a changed snapshot. Restart the list without a cursor.
With independent replicas, configure the same
MCP_STATE_HANDLE_SECRET. Do not decode or construct cursors in the Host.
stdio parsing errors
- Ensure no log/banner/debug output is written to stdout.
- Launch
doris-mcp-server, notdoris-mcp-client. - Confirm the Host uses MCP
2026-07-28request metadata. - Check environment inheritance and executable path.
- Reproduce with a true subprocess, not a shell pipeline that mixes streams.
Provider-specific failures
ADBC unavailable
Confirm ADBC_ENABLED, Arrow Flight SQL ports, provider installation, and live
connectivity. Confirm the end-user request explicitly selected ADBC and the
call includes explicit_adbc=true. ADBC execution intentionally fails closed
on token-bound routes. Use the MySQL read-only query child for ordinary SQL.
Ossie model unavailable
Confirm OSSIE_ENABLED, model directory, reviewed schema revision, exact
model_ref, private binding manifest, semantic scopes, and Doris visibility.
The Server never guesses a model.
MetricFlow model or compile unavailable
Confirm METRICFLOW_ENABLED, the absolute provider command, project directory,
sidecar protocol version, exact model_ref, Doris-dialect support, timeout and
output bounds, semantic scopes, and Doris visibility. Provider stderr is
intentionally hidden; inspect operator logs with secrets removed. The sidecar
must compile only—Doris SQL execution belongs to the MCP Query runtime.
Native lineage unavailable
Check normalized Doris version, companion producer health, queryable store,
required canonical columns, and request permissions. Use
get_lineage_capability_status before tracing. Audit fallback is explicit and
may be unavailable or incomplete.
Safe support bundle
Include:
- version, commit/image digest, OS/Python;
- sanitized configuration keys (no values for secrets);
- domain manifest availability/reason codes;
- health status and timestamps;
- request IDs and sanitized log lines;
- minimal reproducible read-only SQL with sensitive identifiers/data replaced;
- whether the failure reproduces on stdio, HTTP, or both.
Exclude:
- bearer/admin tokens, passwords, JWT keys, OAuth client secrets;
- Authorization headers, token files, raw environment dumps;
- private Ossie bindings, connection URLs with credentials;
- customer SQL/data unless explicitly sanitized and approved.