Describe the issue
TLDR;
Jean’s MCP session-management tools do not expose or correctly apply the same model, provider, fast mode, effort, and execution mode settings available through the Jean UI.
As a result, AI agents using Jean MCP can create messages whose effective settings differ from the session’s UI selections. The resulting Jean history also omits provider metadata at the message level, making MCP-created prompts appear incomplete or different from human-authored prompts.
Additionally, Jean will pick a random or default provider and model, which can make results differ from expectation or planned usage cost. For example expecting to use Luna Max and using Sol High, burning your session instantly.
In detail:
MCP actions are incomplete
The MCP registry currently exposes:
create_session
send_chat_message
get_session_status
read_session_messages
- related session/worktree actions
However, it does not expose session actions for:
- setting the persistent model
- setting the provider/profile
- setting the backend independently
- setting the effort level
- setting the thinking level
- toggling fast/unfast mode
- discovering model capabilities or supported effort levels
The internal dispatch layer already supports several of these operations, but they are not available through MCP.
Relevant code:
jean-core/src/jean_mcp_core.rs
jean-core/src/http_server/dispatch.rs
send_chat_message does not inherit session settings
The MCP send_chat_message schema only accepts:
It does not accept or forward:
effortLevel
thinkingLevel
customProfileName / provider
backend
When optional values are omitted, the shared send path receives None rather than resolving the session’s persisted selections.
This affects both new and continued sessions.
Fast/unfast support is only implicit
Backend implementations support fast model variants such as:
gpt-5.5-fast
gpt-5.6-sol-fast
claude-opus-4-6[1m]-fast
But MCP has no first-class fast-mode control or capability discovery. Agents must know and provide backend-specific raw model IDs, and model selection is only a one-turn override rather than a persistent session setting.
Effort levels are not available through MCP
The internal chat dispatch supports effort values including:
minimal
low
medium
high
xhigh
max
ultracode
The MCP schema neither documents nor forwards effortLevel, so MCP-created turns receive no explicit effort setting.
Provider metadata is not represented on ChatMessage
Run metadata stores the provider/profile as custom_profile_name, but the reconstructed ChatMessage only exposes:
- model
- execution mode
- thinking level
- effort level
Provider/profile is not included. Consequently, Jean cannot display the provider used for an individual message, even when it exists in the underlying run metadata.
Human and MCP prompts use the same persistence path, but MCP supplies less metadata
Human and MCP prompts ultimately use the same send_chat_message and run-log persistence path. The apparent difference is caused by:
- the UI explicitly passing current settings;
- the UI adding optimistic messages with metadata;
- MCP only passing a subset of settings;
- MCP returning before the send completes.
This makes MCP messages appear to be stored differently, although the primary issue is incomplete metadata propagation and missing default resolution.
MCP send errors are hidden
MCP send_chat_message is fire-and-forget. It returns status: "started" immediately, while execution errors are only logged and must be discovered through later status polling.
Expected behavior
MCP session operations should provide behavior equivalent to the Jean UI:
-
Agents can select and persist:
- backend
- provider/profile
- model
- fast/unfast variant
- effort level
- thinking level
- execution mode
-
A message with omitted settings inherits the session’s persisted selections.
-
The same behavior applies to both new and continued/resumed sessions.
-
Every persisted user message exposes the effective:
- backend
- provider/profile
- model
- fast/unfast state, where applicable
- effort/thinking level
- execution mode
-
MCP rejects invalid combinations synchronously where possible, or returns a trackable request ID and exposes the failure through status.
-
The Jean UI displays provider/profile metadata consistently for human- and MCP-created messages.
Proposed acceptance criteria
Replication
- In Jean, configure a session with a non-default provider, model, effort level, and
build mode.
- Send a human-authored prompt and note the displayed metadata.
- Use MCP
send_chat_message with only:
{
"sessionId": "...",
"message": "Inspect the current implementation"
}
- Inspect the resulting run and Jean history.
- Observe that the MCP turn does not reliably inherit the session’s provider, effort, model, or build mode, and that provider metadata is not shown on the resulting message.
How are you running Jean?
App
Operating system
macOS 27 Beta 4
Jean version
v0.1.73
How are you interacting with Jean?
Remotely via another Jean app
Describe the issue
TLDR;
Jean’s MCP session-management tools do not expose or correctly apply the same model, provider, fast mode, effort, and execution mode settings available through the Jean UI.
As a result, AI agents using Jean MCP can create messages whose effective settings differ from the session’s UI selections. The resulting Jean history also omits provider metadata at the message level, making MCP-created prompts appear incomplete or different from human-authored prompts.
Additionally, Jean will pick a random or default provider and model, which can make results differ from expectation or planned usage cost. For example expecting to use Luna Max and using Sol High, burning your session instantly.
In detail:
MCP actions are incomplete
The MCP registry currently exposes:
create_sessionsend_chat_messageget_session_statusread_session_messagesHowever, it does not expose session actions for:
The internal dispatch layer already supports several of these operations, but they are not available through MCP.
Relevant code:
jean-core/src/jean_mcp_core.rsjean-core/src/http_server/dispatch.rssend_chat_messagedoes not inherit session settingsThe MCP
send_chat_messageschema only accepts:modelexecutionModeIt does not accept or forward:
effortLevelthinkingLevelcustomProfileName/ providerbackendWhen optional values are omitted, the shared send path receives
Nonerather than resolving the session’s persisted selections.This affects both new and continued sessions.
Fast/unfast support is only implicit
Backend implementations support fast model variants such as:
gpt-5.5-fastgpt-5.6-sol-fastclaude-opus-4-6[1m]-fastBut MCP has no first-class fast-mode control or capability discovery. Agents must know and provide backend-specific raw model IDs, and model selection is only a one-turn override rather than a persistent session setting.
Effort levels are not available through MCP
The internal chat dispatch supports effort values including:
minimallowmediumhighxhighmaxultracodeThe MCP schema neither documents nor forwards
effortLevel, so MCP-created turns receive no explicit effort setting.Provider metadata is not represented on
ChatMessageRun metadata stores the provider/profile as
custom_profile_name, but the reconstructedChatMessageonly exposes:Provider/profile is not included. Consequently, Jean cannot display the provider used for an individual message, even when it exists in the underlying run metadata.
Human and MCP prompts use the same persistence path, but MCP supplies less metadata
Human and MCP prompts ultimately use the same
send_chat_messageand run-log persistence path. The apparent difference is caused by:This makes MCP messages appear to be stored differently, although the primary issue is incomplete metadata propagation and missing default resolution.
MCP send errors are hidden
MCP
send_chat_messageis fire-and-forget. It returnsstatus: "started"immediately, while execution errors are only logged and must be discovered through later status polling.Expected behavior
MCP session operations should provide behavior equivalent to the Jean UI:
Agents can select and persist:
A message with omitted settings inherits the session’s persisted selections.
The same behavior applies to both new and continued/resumed sessions.
Every persisted user message exposes the effective:
MCP rejects invalid combinations synchronously where possible, or returns a trackable request ID and exposes the failure through status.
The Jean UI displays provider/profile metadata consistently for human- and MCP-created messages.
Proposed acceptance criteria
send_chat_messagewith a clearly documented settings object.Replication
buildmode.send_chat_messagewith only:{ "sessionId": "...", "message": "Inspect the current implementation" }How are you running Jean?
App
Operating system
macOS 27 Beta 4
Jean version
v0.1.73
How are you interacting with Jean?
Remotely via another Jean app