fix(mcp): stop reporting false OAuth success when no token was obtained - #34807
Merged
Conversation
…orkaround The execute_code sandbox-child env scrub (1083977, #27303) deliberately dropped the broad HERMES_ prefix passthrough, keeping only an operational 4-var allowlist (HERMES_HOME/PROFILE/CONFIG/ENV). A script that relied on a non-secret HERMES_* var (HERMES_BASE_URL, HERMES_KANBAN_DB, HERMES_*_WEBHOOK, or a plugin-defined one) now sees it unset in the child. Document the behavior change and the two recovery routes (terminal.env_passthrough in config.yaml, or required_environment_variables in skill frontmatter), plus the debug log line that surfaces the drop for diagnosis.
`hermes mcp login` reported "Authenticated — N tool(s) available" for servers that serve tools/list without auth (e.g. Google's official Drive MCP server) even when the OAuth flow never completed — dynamic client registration 400'd because the provider doesn't support RFC 7591, so no token was ever acquired. Every real tool call then hung until timeout with no indication of why. Login now verifies a token actually landed on disk after the probe. When it didn't, it warns that authentication didn't complete and shows the config needed to supply a pre-registered client_id/client_secret (the existing, already-supported workaround for DCR-less providers). Adds a docs pitfall for Google Drive / Atlassian-style providers. Fixes #34775
1 task
1 task
KKT-OPT
pushed a commit
to KKT-OPT/hermes-agent
that referenced
this pull request
May 31, 2026
…ed (NousResearch#34807) * docs(code-execution): document HERMES_* env narrowing + passthrough workaround The execute_code sandbox-child env scrub (1083977, NousResearch#27303) deliberately dropped the broad HERMES_ prefix passthrough, keeping only an operational 4-var allowlist (HERMES_HOME/PROFILE/CONFIG/ENV). A script that relied on a non-secret HERMES_* var (HERMES_BASE_URL, HERMES_KANBAN_DB, HERMES_*_WEBHOOK, or a plugin-defined one) now sees it unset in the child. Document the behavior change and the two recovery routes (terminal.env_passthrough in config.yaml, or required_environment_variables in skill frontmatter), plus the debug log line that surfaces the drop for diagnosis. * fix(mcp): stop reporting false OAuth success when no token was obtained `hermes mcp login` reported "Authenticated — N tool(s) available" for servers that serve tools/list without auth (e.g. Google's official Drive MCP server) even when the OAuth flow never completed — dynamic client registration 400'd because the provider doesn't support RFC 7591, so no token was ever acquired. Every real tool call then hung until timeout with no indication of why. Login now verifies a token actually landed on disk after the probe. When it didn't, it warns that authentication didn't complete and shows the config needed to supply a pre-registered client_id/client_secret (the existing, already-supported workaround for DCR-less providers). Adds a docs pitfall for Google Drive / Atlassian-style providers. Fixes NousResearch#34775
1 task
alt-glitch
pushed a commit
that referenced
this pull request
Jun 14, 2026
…ed (#34807) * docs(code-execution): document HERMES_* env narrowing + passthrough workaround The execute_code sandbox-child env scrub (2333dad, #27303) deliberately dropped the broad HERMES_ prefix passthrough, keeping only an operational 4-var allowlist (HERMES_HOME/PROFILE/CONFIG/ENV). A script that relied on a non-secret HERMES_* var (HERMES_BASE_URL, HERMES_KANBAN_DB, HERMES_*_WEBHOOK, or a plugin-defined one) now sees it unset in the child. Document the behavior change and the two recovery routes (terminal.env_passthrough in config.yaml, or required_environment_variables in skill frontmatter), plus the debug log line that surfaces the drop for diagnosis. * fix(mcp): stop reporting false OAuth success when no token was obtained `hermes mcp login` reported "Authenticated — N tool(s) available" for servers that serve tools/list without auth (e.g. Google's official Drive MCP server) even when the OAuth flow never completed — dynamic client registration 400'd because the provider doesn't support RFC 7591, so no token was ever acquired. Every real tool call then hung until timeout with no indication of why. Login now verifies a token actually landed on disk after the probe. When it didn't, it warns that authentication didn't complete and shows the config needed to supply a pre-registered client_id/client_secret (the existing, already-supported workaround for DCR-less providers). Adds a docs pitfall for Google Drive / Atlassian-style providers. Fixes #34775
T02200059
pushed a commit
to T02200059/hermes-agent
that referenced
this pull request
Jun 18, 2026
…ed (NousResearch#34807) * docs(code-execution): document HERMES_* env narrowing + passthrough workaround The execute_code sandbox-child env scrub (49f3f14, NousResearch#27303) deliberately dropped the broad HERMES_ prefix passthrough, keeping only an operational 4-var allowlist (HERMES_HOME/PROFILE/CONFIG/ENV). A script that relied on a non-secret HERMES_* var (HERMES_BASE_URL, HERMES_KANBAN_DB, HERMES_*_WEBHOOK, or a plugin-defined one) now sees it unset in the child. Document the behavior change and the two recovery routes (terminal.env_passthrough in config.yaml, or required_environment_variables in skill frontmatter), plus the debug log line that surfaces the drop for diagnosis. * fix(mcp): stop reporting false OAuth success when no token was obtained `hermes mcp login` reported "Authenticated — N tool(s) available" for servers that serve tools/list without auth (e.g. Google's official Drive MCP server) even when the OAuth flow never completed — dynamic client registration 400'd because the provider doesn't support RFC 7591, so no token was ever acquired. Every real tool call then hung until timeout with no indication of why. Login now verifies a token actually landed on disk after the probe. When it didn't, it warns that authentication didn't complete and shows the config needed to supply a pre-registered client_id/client_secret (the existing, already-supported workaround for DCR-less providers). Adds a docs pitfall for Google Drive / Atlassian-style providers. Fixes NousResearch#34775
waefrebeorn
pushed a commit
to waefrebeorn/slermes
that referenced
this pull request
Jul 2, 2026
…ed (NousResearch#34807) * docs(code-execution): document HERMES_* env narrowing + passthrough workaround The execute_code sandbox-child env scrub (d76310c, NousResearch#27303) deliberately dropped the broad HERMES_ prefix passthrough, keeping only an operational 4-var allowlist (HERMES_HOME/PROFILE/CONFIG/ENV). A script that relied on a non-secret HERMES_* var (HERMES_BASE_URL, HERMES_KANBAN_DB, HERMES_*_WEBHOOK, or a plugin-defined one) now sees it unset in the child. Document the behavior change and the two recovery routes (terminal.env_passthrough in config.yaml, or required_environment_variables in skill frontmatter), plus the debug log line that surfaces the drop for diagnosis. * fix(mcp): stop reporting false OAuth success when no token was obtained `hermes mcp login` reported "Authenticated — N tool(s) available" for servers that serve tools/list without auth (e.g. Google's official Drive MCP server) even when the OAuth flow never completed — dynamic client registration 400'd because the provider doesn't support RFC 7591, so no token was ever acquired. Every real tool call then hung until timeout with no indication of why. Login now verifies a token actually landed on disk after the probe. When it didn't, it warns that authentication didn't complete and shows the config needed to supply a pre-registered client_id/client_secret (the existing, already-supported workaround for DCR-less providers). Adds a docs pitfall for Google Drive / Atlassian-style providers. Fixes NousResearch#34775
santhreal
pushed a commit
to santhreal/hermes-agent
that referenced
this pull request
Jul 13, 2026
…ed (NousResearch#34807) * docs(code-execution): document HERMES_* env narrowing + passthrough workaround The execute_code sandbox-child env scrub (695298e, NousResearch#27303) deliberately dropped the broad HERMES_ prefix passthrough, keeping only an operational 4-var allowlist (HERMES_HOME/PROFILE/CONFIG/ENV). A script that relied on a non-secret HERMES_* var (HERMES_BASE_URL, HERMES_KANBAN_DB, HERMES_*_WEBHOOK, or a plugin-defined one) now sees it unset in the child. Document the behavior change and the two recovery routes (terminal.env_passthrough in config.yaml, or required_environment_variables in skill frontmatter), plus the debug log line that surfaces the drop for diagnosis. * fix(mcp): stop reporting false OAuth success when no token was obtained `hermes mcp login` reported "Authenticated — N tool(s) available" for servers that serve tools/list without auth (e.g. Google's official Drive MCP server) even when the OAuth flow never completed — dynamic client registration 400'd because the provider doesn't support RFC 7591, so no token was ever acquired. Every real tool call then hung until timeout with no indication of why. Login now verifies a token actually landed on disk after the probe. When it didn't, it warns that authentication didn't complete and shows the config needed to supply a pre-registered client_id/client_secret (the existing, already-supported workaround for DCR-less providers). Adds a docs pitfall for Google Drive / Atlassian-style providers. Fixes NousResearch#34775
donbowman
pushed a commit
to donbowman/hermes-agent
that referenced
this pull request
Jul 13, 2026
…ed (NousResearch#34807) * docs(code-execution): document HERMES_* env narrowing + passthrough workaround The execute_code sandbox-child env scrub (1083977, NousResearch#27303) deliberately dropped the broad HERMES_ prefix passthrough, keeping only an operational 4-var allowlist (HERMES_HOME/PROFILE/CONFIG/ENV). A script that relied on a non-secret HERMES_* var (HERMES_BASE_URL, HERMES_KANBAN_DB, HERMES_*_WEBHOOK, or a plugin-defined one) now sees it unset in the child. Document the behavior change and the two recovery routes (terminal.env_passthrough in config.yaml, or required_environment_variables in skill frontmatter), plus the debug log line that surfaces the drop for diagnosis. * fix(mcp): stop reporting false OAuth success when no token was obtained `hermes mcp login` reported "Authenticated — N tool(s) available" for servers that serve tools/list without auth (e.g. Google's official Drive MCP server) even when the OAuth flow never completed — dynamic client registration 400'd because the provider doesn't support RFC 7591, so no token was ever acquired. Every real tool call then hung until timeout with no indication of why. Login now verifies a token actually landed on disk after the probe. When it didn't, it warns that authentication didn't complete and shows the config needed to supply a pre-registered client_id/client_secret (the existing, already-supported workaround for DCR-less providers). Adds a docs pitfall for Google Drive / Atlassian-style providers. Fixes NousResearch#34775
Gravezzz
pushed a commit
to Gravezzz/hermes-agent
that referenced
this pull request
Jul 21, 2026
…ed (NousResearch#34807) * docs(code-execution): document HERMES_* env narrowing + passthrough workaround The execute_code sandbox-child env scrub (1083977, NousResearch#27303) deliberately dropped the broad HERMES_ prefix passthrough, keeping only an operational 4-var allowlist (HERMES_HOME/PROFILE/CONFIG/ENV). A script that relied on a non-secret HERMES_* var (HERMES_BASE_URL, HERMES_KANBAN_DB, HERMES_*_WEBHOOK, or a plugin-defined one) now sees it unset in the child. Document the behavior change and the two recovery routes (terminal.env_passthrough in config.yaml, or required_environment_variables in skill frontmatter), plus the debug log line that surfaces the drop for diagnosis. * fix(mcp): stop reporting false OAuth success when no token was obtained `hermes mcp login` reported "Authenticated — N tool(s) available" for servers that serve tools/list without auth (e.g. Google's official Drive MCP server) even when the OAuth flow never completed — dynamic client registration 400'd because the provider doesn't support RFC 7591, so no token was ever acquired. Every real tool call then hung until timeout with no indication of why. Login now verifies a token actually landed on disk after the probe. When it didn't, it warns that authentication didn't complete and shows the config needed to supply a pre-registered client_id/client_secret (the existing, already-supported workaround for DCR-less providers). Adds a docs pitfall for Google Drive / Atlassian-style providers. Fixes NousResearch#34775
leewenjie
pushed a commit
to leewenjie/hermes-agent
that referenced
this pull request
Aug 7, 2026
…ed (NousResearch#34807) * docs(code-execution): document HERMES_* env narrowing + passthrough workaround The execute_code sandbox-child env scrub (1083977, NousResearch#27303) deliberately dropped the broad HERMES_ prefix passthrough, keeping only an operational 4-var allowlist (HERMES_HOME/PROFILE/CONFIG/ENV). A script that relied on a non-secret HERMES_* var (HERMES_BASE_URL, HERMES_KANBAN_DB, HERMES_*_WEBHOOK, or a plugin-defined one) now sees it unset in the child. Document the behavior change and the two recovery routes (terminal.env_passthrough in config.yaml, or required_environment_variables in skill frontmatter), plus the debug log line that surfaces the drop for diagnosis. * fix(mcp): stop reporting false OAuth success when no token was obtained `hermes mcp login` reported "Authenticated — N tool(s) available" for servers that serve tools/list without auth (e.g. Google's official Drive MCP server) even when the OAuth flow never completed — dynamic client registration 400'd because the provider doesn't support RFC 7591, so no token was ever acquired. Every real tool call then hung until timeout with no indication of why. Login now verifies a token actually landed on disk after the probe. When it didn't, it warns that authentication didn't complete and shows the config needed to supply a pre-registered client_id/client_secret (the existing, already-supported workaround for DCR-less providers). Adds a docs pitfall for Google Drive / Atlassian-style providers. Fixes NousResearch#34775
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
hermes mcp loginno longer claims "Authenticated — N tool(s) available" when the OAuth flow never actually produced a token.Some MCP servers serve
initialize+tools/listwithout auth (Google's official Drive server, and others). With bareauth: oauth, Hermes attempts dynamic client registration (RFC 7591); providers that don't support DCR reject it with a 400, so no client and no token are created. But the probe still lists tools, so login reported success — and every real tool call then hung until timeout with no indication of why.The fix is provider-agnostic: after the probe, login verifies a token actually landed on disk. The trigger is the universal signature of a failed OAuth setup ("probe succeeded but no token"), not anything Google-specific.
Fixes #34775.
Changes
hermes_cli/mcp_config.py:cmd_mcp_loginchecks_oauth_tokens_present(name)after probing. When false, it warns that auth didn't complete and prints the config block (using the server's own name/URL) for supplying a pre-registeredclient_id/client_secret— the already-supported workaround for DCR-less providers.tests/hermes_cli/test_mcp_config.py: false-success suppressed; genuine success (token written during probe) still reported.website/docs/user-guide/features/mcp.md: pitfall for DCR-less providers (Google Drive, Atlassian).Validation
tests/hermes_cli/test_mcp_config.py: 34 passed.Note: the
mcp_oauth_manager.py:326syntax error in the reporter's logs was self-inflicted (live-editing the file mid-session), not a Hermes bug.Infographic