?toolsets=, with the access each one needs. Hue MCP describes what the tools do together, and Recipes gives tool sequences for common questions.
The connection itself is the authority on the exact arguments: search_hue_tools returns each tool’s input schema as your connection publishes it.
Choose toolsets
This section describes connections without Code Mode. Without a selection, a connection lists theobserve toolset, the production reads: list_projects, get_project_context, search_traces, get_trace, get_span, list_sessions, verify_trace, get_span_content, search_spans, aggregate, get_intent_summary, list_intent_traces, get_request_answer, search_hue_docs and load_hue_guide. Beside them it lists three catalog tools that reach every other tool the connection’s access allows, so a short list loses nothing:
search_hue_toolsfinds tools by keyword ortoolset, 10 per page. Results includename,toolset,summary,access,input_schema,annotationsandcall.execute_hue_toolcalls a read tool bynamewith itsargumentsand returns exactly what calling it directly returns.execute_hue_write_toolcalls a write tool the same way. It is listed only with write access and without?read_only=true.
list_projects, then search_hue_tools with query: "eval set", then execute_hue_tool with {"name": "list_eval_sets", "arguments": {"project_id": "<id>"}}.
To list tools directly, add ?toolsets=<names> to the server URL or send the X-Hue-MCP-Toolsets: <names> header; both selections form their union. Separate names with commas. author, evaluate, import and outreach match the MCP guides of the same names, debug lists the tools for building a World from one trace, and the other names are the toolset groups below:
The earlier
environments selection lists worlds and instances. A call to a tool’s earlier name, such as list_environments, start_environment_world, list_local_agents or launch_local_run, answers not_found naming the tool that replaced it and its renamed arguments, and executes nothing.
The retired add_world and add_environment tools also answer not_found, point to create_world, and execute nothing. Their old arguments are incompatible with create_world. MCP no longer supports creating a World identity without publishing a version, choosing a custom slug, or creating an identity first to publish an authored definition with custom actions.
On ordinary toolset connections,
list_projects and get_project_context are always listed, and get_project_context reports the selection as toolsets: the names selected, a source of default when the connection named none, any names it ignored, the names available, and, when some tools are not listed, their count per group as unlisted with a widen hint on how to reach them. An unknown name never fails a request; a selection with only unknown names lists the default. Read access and ?read_only=true still apply inside a selection. A client keeps the tool list it read when it connected: after you change the URL, restart the client, or remove a connector and add it again.
Code Mode
Code Mode requires a valid Read or Read and write API key, or an authenticated sign-in connection. The optional URLhttps://mcp.hue.run/mcp?code_mode=true replaces the toolset listing. Code Mode lists 4 tools with write access, or 3 tools with Read access. read_only=true also hides the write executor.
Combine URL parameters with
&, for example 'https://mcp.hue.run/mcp?code_mode=true&read_only=true'. Keep shell URLs quoted. code_mode=true takes precedence over the toolset listing, including toolsets=all. Remove it to restore that listing, then reconnect the client.
Call execute_hue_tool with {"name": "list_projects", "arguments": {}} first. Pass the chosen project_id once on execute_hue_code; every hue.call in that program omits it. An API key can omit the outer selector to use its default project. Pinned connections must omit it. For a project read through execute_hue_tool, follow native_input_schema and put project_id inside arguments instead. An unpinned organization sign-in connection requires that selector.
For example, pass this function body as code to execute_hue_code to compare two production windows:
hue.call returns the tool’s structured result. The program’s return value appears in structuredContent.value; execution counters appear in structuredContent.usage. Await every call before returning. Use existing aggregate and answer tools for their calculations, and return the evidence the agent needs to interpret the result. Writes, including launching runs and starting World instances, stay outside the program in execute_hue_write_tool.
Each read uses the authenticated connection’s permissions, content opt-in, redaction and auditing. Recorded content remains untrusted data. The runtime exposes no imports, direct network access, filesystem or host credentials. An uncaught tool error preserves its Hue error code and retry guidance. Invalid JavaScript or a result that cannot serialize as JSON answers invalid_argument; time limits and cancellation answer timeout.
These are per-program safeguards, not a per-user request quota. Up to four reads run at once within a program; additional reads wait. Up to two programs run at once per service process; additional programs wait in a bounded queue. Queueing counts toward the 20-second wall limit or an earlier request deadline. An overloaded queue returns a retryable error.
Limits stop the program with an error. Narrow the work, split it into programs, or use
execute_hue_tool with the discovered native_call and native_input_schema. The native executor preserves the ordinary MCP result without the program’s transfer or return-size budgets. Inner tools retain their own pagination, result sizes and time limits.
Hue runs each program in an isolated JavaScript runtime within its existing service, without a separate hosted sandbox for each execution. It runs the generated JavaScript, not the client’s whole agent. Execution still consumes CPU and memory, and its reads still use backend resources. Latency and token use depend on the task and client.
Access levels
The Access column of each table uses these levels. A level can add a role requirement after a comma. Organization access also applies to keys and sign-in connections. For a trial organization, Read and write does not unlock tracing or evaluations. The shared key in a trial’s agent prompt cannot use owner- or admin-only tools, including creating or revoking project keys. This restriction also applies when an owner or admin replaces the shared key. Manage the organization in Settings.Permissions
Tools by toolset
project
On ordinary toolset connections, list_projects and get_project_context are listed under every selection.
traces
Listed by default: search_traces, get_trace, get_span, list_sessions, verify_trace, get_span_content, search_spans and aggregate. The trace-check tools produce results only for projects set up for trace checks, and the import tools serve Bulk import existing traces. search_traces, search_spans, aggregate and list_sessions leave out traces your runs recorded unless run_traces is include, only or a run id; see traces from runs.
eval_sets
Eval sets and evaluators.
runs
Runs execute an eval set version’s cases; scoring runs score outputs that already exist.
judges
World judges and hosted judge jobs.
cases
Cases built from traces, from a single trace or in bulk from Suggested cases. See Create a case.
runners
Connected agents (local workers, managed targets and GitHub deployments), their dispatches, and artifacts.
worlds
Worlds: authored definitions and their versions (world_definition_id, world_version_id), trace builds and their uploads, retained World models, and the simulated apps. The debug profile lists the tools for building a World from one trace and trying it.
For a new World,
create_world takes name, apps, and an idempotency_key. Reuse the key when retrying creation. It accepts neither raw definition_json nor a custom slug. Creation publishes a version; it does not start an instance.
instances
An instance is one running or saved World runtime; its tools take instance_id.
For a model start, optional
checkpoint_selection pins an existing preview’s selection with at, cutoff, interpretation_digest, and generation. Its at must match the start’s at. Reuse the selection and idempotency_key while preparation finishes. Without a selection, Hue selects the latest completed evidence when it admits the start.
intents
Listed by default: get_intent_summary, list_intent_traces and get_request_answer.
docs
Listed by default: both tools. Each guide is also an MCP resource, hue://guides/<topic>, and the prompts triage_production, investigate_trace, case_from_trace (write access only) and evaluate start a workflow over one.
Catalog tools
Listed beside every toolset selection exceptall, which lists every tool directly instead. Code Mode also lists the catalog tools.
Recipes
The Hue MCP server reads stored traces, spans, findings, trace checks and intents, plus counts and percentiles. It does not diagnose; your agent analyzes the returned data. A Read key is sufficient. The defaultobserve toolset includes most recipe tools. Find get_intent_taxonomy and trace-check reads with search_hue_tools, then call them through execute_hue_tool, or list all tools with ?toolsets=all. get_request_answer covers cross-request behavior for projects whose requests Hue maps. load_hue_guide with production returns this guide in MCP; resource clients also expose hue://guides/<topic>. triage_production (window, default 7d) and investigate_trace (trace) prompts appear in Claude Code as /mcp__hue__triage_production and /mcp__hue__investigate_trace.
Use aggregate for counts and percentiles, search_spans for individual steps, and get_span_content for exact recorded values. search_traces and get_trace connect spans to requests.
Each recipe is a short sequence of tool calls with their key arguments. Replace 24h with the window the user asked for. aggregate and search_spans read spans over at most 7 days; trace reads cover up to 90 days.
Before you start
- Select the project. API keys and organization sign-in reach active projects in their organization. Confirm the project from
list_projectsand pass its id or slug asproject_id. An API key can omit it to use its default project. Pinned connections omit that argument and reportconnection.pinned: true. - Keep the tool boundary consistent. Hue arguments and outputs use recursive
snake_case; recorded attribute maps keep application keys. Object ids and result names use product terms, and app-page ids accept Hue links. JSON arguments that round-trip trace-check definitions, calibration or judge bars must use returnedsnake_casekeys; camelCase is rejected. - State the method. Ask the agent to report its window, filters, traces opened and links; its analysis is not a Hue-generated diagnosis.
- Report limits.
aggregateandtotal_countcover the filtered window unlessscan_capped,partial,total_cappedortotal_count_cappedsays otherwise. Search result pages are samples; state when the agent opens only a bounded sample. - Rankings use counts.
aggregatereturns the top 10 groups (up to 25), with the rest inother; filter or raisetopto inspect rare groups. - Check empty results. A narrow window, filter or disabled feature can return nothing.
get_project_context.featureslists enabled features; widen the window or remove filters before concluding nothing happened. - Rows omit null or empty fields. Shared links may be returned once as a URL template.
- Content is opt-in and audited. Request it with
get_span_contentorinclude_content: trueonly when needed; results mark recorded content as untrusted. See the security model.
Find traces that need attention
Prompt: “What needs attention in the last 24 hours, and why? Link the traces.” Sequence:get_project_context → aggregate with {"since": "24h", "group_by": ["attention_state"]} and {"since": "24h", "group_by": ["finding"]} → search_traces with {"since": "24h", "attention": "needs_attention"} or {"since": "24h", "status": "error"} → get_trace → get_span_content for exact evidence.
Caveat: needs_attention includes findings and positive active trace checks; uncertain means Hue could not settle a finding.
Find failing tools
Prompt: “Which tools failed most often yesterday, and what was their failure rate?” Sequence:aggregate with {"entity": "spans", "since": "24h", "kind": "tool", "group_by": ["tool"], "metrics": ["count", "error_count", "duration_p95_ms"], "top": 25} → search_spans with {"since": "24h", "kind": "tool", "status": "error", "name": "<span name>"} → get_span_content with {"attribute_keys": ["gen_ai.tool.call.arguments", "gen_ai.tool.call.result"]}.
Caveat: Groups rank by call count, and span name may differ from tool name; an errored call does not prove the request failed. search_traces with "finding": "unrecovered_tool_error" lists traces where the agent did not recover.
Find slow tasks and steps
Prompt: “Which task types and steps were slowest this week?” Sequence:aggregate with {"since": "7d", "group_by": ["trace_name"], "metrics": ["count", "duration_p50_ms", "duration_p95_ms", "duration_p99_ms"]} → aggregate spans with {"entity": "spans", "since": "7d", "trace_name": "<name>", "group_by": ["name"], "metrics": ["count", "duration_p50_ms", "duration_p95_ms"]} → search_traces and search_spans with {"since": "7d", "trace_name": "<name>", "sort": "duration"} → get_trace_check_summary with {"since": "7d"}.
Caveat: Intent grouping needs a published taxonomy; duration sorting includes completed traces only.
Measure time to first reply
Prompt: “How long did users wait for the first useful reply?” Sequence:aggregate with {"entity": "spans", "since": "7d", "name": "<span that delivers the reply>", "group_by": ["trace_name"], "metrics": ["count", "start_offset_p50_ms", "start_offset_p95_ms"]} gives the time until that span starts, per task type → search_spans with {"since": "7d", "name": "<span that delivers the reply>"} for individual reply-span rows → sum each row’s start_offset_ms and duration_ms for end time, then take percentiles of those sums.
Caveat: Identify the reply span, which depends on the application, and page through every row in the window with next_cursor in the default newest-first order, or report a sample; a sort: "duration" page would skew it. Separate start-offset and duration percentiles cannot be added. With timing enabled, use search_traces.first_useful_answer_ms or get_trace_check_summary.requests for first-response, useful-playback, useful-server and completion p50 and p95 values.
Compare releases
Prompt: “Did the latest release regress?” Sequence:aggregate with {"since": "7d", "group_by": ["release"], "metrics": ["count", "error_count", "duration_p50_ms", "duration_p95_ms"]} → search_traces with {"since": "7d", "release": "<release>", "status": "error"} → get_trace to compare examples → aggregate with {"since": "<T minus 24h>", "until": "<T>"} and {"since": "<T>", "until": "<T plus 24h>"}.
Caveat: Without a recorded release, compare rates in equal ISO-8601 windows around deploy time; concurrent releases can mix them.
List a user’s or session’s traces
Prompt: “Show user<id>’s traces and sub-agent activity from the last seven days.”
Sequence: search_traces with {"since": "7d", "user": "<user id>"} or {"since": "7d", "user_prefix": "<user id>:"} → aggregate with {"since": "7d", "group_by": ["user"], "metrics": ["count", "error_count"]} → list_sessions with {"query": "<session key or part of it>", "since": "7d"} → search_traces by session_id.
Caveat: Include the separator in a user prefix to avoid matching similar IDs; sessions group users only when the application records one session per user.
Find sub-agent handoffs
Prompt: “How does the agent hand work to sub-agents?” Sequence: inspect agent and handoff spans withget_trace or search_spans using {"since": "24h", "kind": "agent"}; follow separate roots by user, trace name, session or span links. Use search_traces with {"since": "7d", "check_key": "delegation"} for positive delegation trace-check results.
Caveat: When parent IDs exist only in recorded content, read them with get_span_content.
Compare tool input and output sizes
Prompt: “Which tools return the largest results?” Sequence:aggregate with {"entity": "spans", "since": "24h", "kind": "tool", "group_by": ["tool"], "metrics": ["count", "input_bytes_p50", "output_bytes_p95", "output_bytes_max"]} → search_spans for calls behind a maximum.
Caveat: Byte counts are UTF-8 sizes of recorded JSON, without reading content.
Find traces by model or attribute
Prompt: “Find traces for model<model> or attribute app.plan=enterprise.”
Sequence: search_traces with {"since": "24h", "model": "<model>"} or {"since": "24h", "attribute": {"key": "app.plan", "value": "enterprise"}} → search_spans for attributes on any span.
Caveat: Trace model or attribute searches scan the newest 5,000 matches and report scan_capped; content attributes are refused.
Read span content
Prompt: “Show the exact tool arguments and result for<trace>.”
Sequence: get_span_content with {"attribute_keys": ["gen_ai.tool.call.result"]} for trace and span IDs, then select fields, path or attribute_keys. Text uses UTF-16 slices with total_length and next_offset; omitted spans appear in omitted_span_ids.
For a log record’s values, pass one span in span_ids, the ids of logs that get_span with include_logs: true listed in log_ids, and the log_cursor of that page, if any. fields are body, the default, and attributes. A span or log names the values Hue stored apart from it under blobs; pass one’s key, such as body#/details, in attribute_keys to read it whole. A value that holds only the first 16 KiB of one is marked partial, with its blob_keys.
Caveat: Reads are audited and untrusted; each request reads up to 20 spans or logs, in 8,000-unit slices by default. Invalid paths report available keys.
Review trace check results
Prompt: “Which traces did the delegation check flag this week, and what evidence did it use?” Sequence:list_trace_checks → get_trace_check_summary with {"since": "7d", "check_key": "delegation"} → search_traces with {"since": "7d", "check_key": "delegation"} → get_trace_check_results with {"check_key": "delegation", "state": "present"}; follow next_cursor. See the trace-check data model for definitions and states.
Caveat: Excerpts require include_content: true and are evidence, not explanations.
Data model
Request answers
get_request_answer answers questions about delegation, added_work, handoff_scope, data_cuts, slow_tasks, task_types and answer_time; overview returns every finding. By default it covers the last 7 days of production traffic only, for up to 90 days. environments: ["all"] and include_simulated: true include simulator traffic; program, model and release filter exactly.
Each answer’s n counts requests, handoffs or reads. coverage reports eligible, judged, pending and provisional units, the share with complete evidence, and evidence gaps. Answers include environment and user splits and example requests with traces. limit defaults to 5 examples per finding (up to 25); more_call gets the rest, and finding returns one finding’s examples. group_by adds a series by day, release, model, program, environment, user or intent. notes lists caveats on the numbers; no notes means none. include_content: true adds example request text as untrusted, audited content. no_data means no mapped request matched the window and filters. When get_project_context.features.request_answers.available is false, Hue does not map the project’s requests; trace checks or spans answer these questions instead. Model judgments also require AI request judges.
Traces and spans
A trace is a root span and its tree; each span records one timed operation. In multi-agent apps, a trace may represent one agent activation rather than one user turn. Sessions group traces by the session id your application records.search_traces filters a window by status, attention, finding, check_key, user, user_prefix, release, trace_name, model, a root-span attribute, deployment_environment, run_traces, session_id, min_duration_ms and query (title, root span name or trace id), and sorts by started_at (newest first) or duration (longest first). It returns these fields per trace:
get_trace adds has_input, has_output and revision, run for a trace one of your runs recorded (the run’s id and name, the case_id, the execution_id that get_run_execution reads, and a link to the case result), world, the trace’s World capture (its state, and the reason for an unresolved or ineligible trace; see Why a trace added nothing to a World model), the stored findings (the assessment’s attention_state, items with each finding’s id, label, state, source and span_ids, and tool_errors with each error’s span, tool and error_type), the trace-check results as checks, and span rows in start order. Each span row has id, span_id, parent_span_id, name, kind, status, status_message, error_type, state, operation, tool, started_at, ended_at, duration_ms, model, tokens, input_bytes and output_bytes. A span’s kind is tool, agent, embedding or llm when Hue recognizes the operation. Otherwise it is the recorded operation name, such as chain, or the OpenTelemetry span kind, such as internal. A span’s status comes only from its OpenTelemetry status code.
search_spans returns span rows from many traces with the same fields, plus the span’s trace_id and start_offset_ms, the time from its trace’s start to its own. It filters a window of up to 7 days by span name, kind, status, model, min_duration_ms and one attribute, and by the trace’s trace_name, user, user_prefix, release, session_id and run_traces; it sorts newest or longest first and reports total_count. When nothing matches a name or trace_name, it suggests the closest recorded names.
get_span returns one span: status with its code and a message of up to 200 characters, model, usage (input, output, cache and reasoning tokens where recorded), gen_ai (operation, provider, response_model, agent_name, session_id, user_id and the detected profiles), tool (name and call_id), has_input and has_output, service, attribute_keys (the names of up to 100 recorded attributes, never their values) and event_names. When the result fits max_chars, it also carries the instrumentation scope, the dropped-attribute and dropped-event counts, and span links.
get_span also lists up to 64 files: the images, audio and documents the span records. Each has its role and, where known, modality, media_type, name, size, sha256, a remote uri, a provider file_id, or langfuse_media_id for a file held in Langfuse. A file whose bytes the span lists under hue.blobs also has its key and state: stored, missing (never uploaded, or erased) or unavailable. With include_content: true, each stored file, and each file held inline as a data: URL or base64 part of up to 1 MiB, adds download_url, a link valid for five minutes, and download_expires_at; with include_logs: true as well, so do the files of each log on the page. A script with a Read or Read and write key gets the same link from the trace file endpoint.
Traces from runs
A trace that one of your runs recorded while executing a case is a run trace, whatever deployment label it carries, so a run against your staging deployment keepsdeployment_environment: "staging". search_traces, search_spans, aggregate and list_sessions leave run traces out unless run_traces says otherwise, so a question about production or staging traffic counts what your users did:
To compare what the agent did across runs, call
aggregate or search_spans once per run id, for example tool calls and errors per tool. An empty search_traces page that left run traces out says how many in hint. A session that holds any run trace counts as a run session. Reads by id (get_trace, get_span, get_run_execution) return run traces whatever the filter, and the Traces page in Hue follows the same default, with Filter > Run traces to include them or show only them.
Aggregates
aggregate counts a window’s traces (the default), or its traces’ spans over at most 7 days. It filters by status, attention, check_key, session_id, deployment_environment, user, user_prefix, release, trace_name, name (for traces, the root span’s), min_duration_ms and run_traces. Span aggregates also filter by kind, model and tool, and refuse attention and check_key.
group_bytakes up to two dimensions. Traces group bytrace_name,name(the root span’s),status,attention_state,finding,intent,user,releaseandbucket; spans bytrace_name,name,kind,status,model,tool,user,releaseandbucket.bucketis a time series of5m,15m,1h,6hor1dbuckets, at most 96, and counts as one of the two dimensions.intentneeds a published taxonomy.metrics, up to 8:count(always returned),error_count,duration_p50_ms,duration_p95_ms,duration_p99_ms,input_tokensandoutput_tokens; for spans alsostart_offset_p50_ms,start_offset_p95_ms,input_bytes_p50,input_bytes_p95,input_bytes_max,output_bytes_p50,output_bytes_p95andoutput_bytes_max.rowshold thetopgroups by count (10 by default, up to 25);othertotals the rest andgroup_countcounts every group. A group’s value is the recorded string, so it works as a filter, and anullgroup holds the traces or spans that recorded none.totalcounts the filtered window assearch_tracesdoes.- A trace aggregate reads the window’s newest 300,000 traces and says
scan_cappedandcovered_sincewhen the window holds more. A span aggregate reads its whole window. A part that runs out of time returnspartial: truewithtimed_out.
Attention states and findings
By default, Hue assesses each quiet, ended production trace. Evaluation-run traces are not assessed.attention_state is:
The
attention filter of search_traces takes needs_attention or uncertain, and finding takes one finding id. The findings are:
Model findings come from the model pass that AI processing describes. Request-check findings appear only in projects where Hue has set up request checks; there they decide the attention state of each request’s main-agent trace.
finding_ids lists present findings; get_trace returns their state, source and span IDs. stale: true means newer spans arrived after assessment. findings.judge_state and skip_reason explain when the model did not judge a trace.
Trace checks
Trace checks are project-owned, versioned checks of production behavior. They are advisory, not evaluator scores. The four checks aredelegation (execution stayed with the orchestrator instead of a sub-agent), action_scope (execution expanded the request), delegation_scope (a handoff expanded the request) and output_omission (needed tool information was omitted). They produce results only after a project sets them up: instrumentation that marks the request and its boundaries, and a version activated against labelled traces.
A result is present, absent, uncertain, unavailable (not enough evidence) or not_applicable. A trace’s check_state is needs_attention, pending, uncertain, unavailable, not_applicable, no_findings or null when no active version applies to it.
Intents
Intents classify traces into the project’s taxonomy of task types.get_intent_summary returns total, coverage and buckets, and consent, which is always true. Bucket keys are category:<key>, other, uncertain, no_user_text, failed and pending (not classified yet). Classification needs a published taxonomy (get_intent_taxonomy returns null without one). get_intent_summary and list_intent_traces take since and until and default to the last seven days. list_intent_traces returns the same trace rows as search_traces, with the summary’s total_count; follow next_cursor with the same window and bucket. aggregate groups traces by intent for durations and error counts per task type.
Field glossary
Hue reads these span attributes into its fields. When several are present, the first one listed wins, so the OpenTelemetry GenAI attribute wins over a Langfuse one. Hue reads only span attributes, with two exceptions: a trace’srelease also takes service.version from the resource, and a span that names no user gives the trace’s user_id its resource’s user. get_span returns service.name as service.
A trace’s user_id, release and trace_name are its root span’s, else those of the earliest span that has one; user_id never comes from a tool span or a span beneath one. Each is stored whole up to 200 characters. search_traces, search_spans and aggregate filter by them exactly with user, release and trace_name, user_prefix matches the start of user_id, and aggregate groups by user, release and trace_name.
Spans from the other instrumentations Hue normalizes fill the same fields from their own attributes.
Hue reads the user and session from these metadata maps, in this order:
ai.telemetry.metadata (Vercel AI SDK), ai.settings.context (AI SDK 7 runtime context), Raindrop’s ai.telemetry.metadata.raindrop and ai.telemetry.metadata.raindrop.ai, traceloop.association.properties (Traceloop and OpenLLMetry), Raindrop’s ai.telemetry.metadata.traceloop.association.properties, langfuse.trace.metadata, langfuse.observation.metadata, langsmith.metadata, braintrust.metadata, mastra.metadata and OpenInference’s metadata. Hue reads a field flattened (<map>.<field>) or from one JSON object recorded under the map, and decodes a JSON-encoded string value, as Langfuse’s SDKs write metadata. A user or session ID is a non-blank string or an integer. A Claude Code user.id recorded beside user.account_uuid names an installation, not a user, so Hue skips it for the next key, such as enduser.id.
Langfuse metadata (langfuse.observation.metadata.*, langfuse.trace.metadata.*), langfuse.environment, tags and levels are kept as raw attributes. get_span lists their names in attribute_keys; get_span_content with attribute_keys reads their values, and the attribute filter matches the ones that are not content or free text. The OpenTelemetry guide lists the attributes worth recording so these fields are filled.
Limits and errors
A tool that fails returns an MCP error result (
isError: true) whose text starts with a code, then the message, sometimes a hint, and Retryable. or Retryable after <n> ms. when a retry can succeed, for example timeout: The query exceeded its time budget. Narrow the window … Retryable. The same fields (code, message, hint, retryable, retry_after_ms) are in the result’s _meta under hue.run/error for clients that read them programmatically. Retry only when the error says so. A write that is not safe to repeat and fails with unavailable or timeout may already have completed: its error does not say Retryable., and its hint says to read the write’s state before trying again.
For Read access, or a read-only request (
read_only on the URL or the X-Hue-MCP-Read-Only header set to any value but false, 0, no, off or empty), write tools and execute_hue_write_tool are not registered at all: a direct call to a write fails as an unknown tool, and naming one to execute_hue_tool answers not_found. On a connection with write access, an executor given a tool of the other access answers invalid_argument naming the right executor.
At the HTTP level, a busy server instance answers 503 with Retry-After: 1; retry after a second and keep parallel tool calls to a few. Ten failed authentications for one key within a minute answer 429 with Retry-After: 60. A request body over 1 MiB answers 413, and one that is not application/json answers 415. A JSON-RPC batch, a JSON array of messages, answers 400 without running any of them, so send one message per request. The connection guide’s troubleshooting covers these and the authentication errors.
World build gap codes
get_world_build counts what the trace left out as gaps, each with a code, a count and sample references, and Hue returns a sentence beside each code. Case eligibility reports the unmapped-call codes in world.gaps.
Hue reports any other code as
unknown_ followed by a digest.