# Reported issues for google-jules-mcp-server

Pod holds 20 of 31 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to [google-jules-mcp-server](/mcp/google-jules-mcp-server).

## Most discussed

### Session change-set outputs are discarded: a session whose result is a patch has no way to surface it

**What's the problem?**

`SessionOutputSchema` (`src/resources/sessions/schemas.ts:34`) models a single field:

```ts
export const SessionOutputSchema = z.object({
  pullRequest: PullRequestSchema.optional(),
});
```

Real sessions return more than that. Session `18290074838581230171` came back with `outputs` as `[changeSet, pullRequest]`, where the change set carried the complete diff:

```
outputs[0].changeSet.gitPatch.unidiffPatch  — the full unified diff
outputs[0].changeSet.gitPatch.baseCom

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/25) · 2026-08-09 · closed · 3 comments

### Trim char-budget constants in activities/format.ts

**What's the problem?**
`src/resources/activities/format.ts:25-31` defines 6 char-budget constants (`SUMMARY_CHAR_BUDGET`, `LIST_ITEM_CHAR_BUDGET`, `LIST_PAGE_CHAR_BUDGET`, `DETAIL_CHAR_BUDGET`, `CHANGE_SET_DIFF_CHAR_BUDGET`, `LIST_ITEM_SLACK`). `LIST_ITEM_SLACK = 150` is self-described over-tuning in its own comment ("Below this the recovery hint costs more than the cut saves").

**Proposed solution**
Collapse to the 2-3 constants that actually gate a different render path. Est. -3 lines, fewer

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/69) · 2026-08-24 · closed · 2 comments

### Create AGENTS.md

**What's the problem?**
I want to make agent-driven development better by providing context to the AI agents. As I started using Jules for development of this MCP Server, Jules can work better when AGENTS.md file is present.

**Proposed solution**
- Create an AGENTS.md file covering the current project in depth, following best practices for creating AGENTS.md.

**Alternatives considered**
No AGENTS.md exists.

**Sample AGENTS.md for this project**

```bash
# AGENTS.md

## Project Overview
- **Co

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/60) · 2026-08-24 · closed · 2 comments

### Minimum Codecov coverage threshold

**What's the problem?**
Every time when a new PR is created, if the code coverage drops bellow previous value, Codecov will will fail and the PR will cannot be merged.

**Proposed solution**
Setup a minimum code coverage threshold of 90% with a thresholds of 1%. This is for the entire project.

```yaml
coverage:
  status:
    project:
      default:
        target: 90%      # Minimum expected total coverage percentage
        threshold: 1%    # Allowed drop leeway percentage before failing
```

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/33) · 2026-08-15 · closed · 2 comments

### jules_get_session_output reports "no pull request was created" when the PR is not first in outputs[]

**Describe the bug**

`session.outputs` is a list that can hold more than one entry, and the pull request is not reliably the first one. All three session formatters read index 0 and nothing else:

- `src/resources/sessions/format.ts:12` — `formatSessionList`
- `src/resources/sessions/format.ts:81` — `formatSessionStatus`
- `src/resources/sessions/format.ts:112` — `formatSessionOutput`

When a session emits a change set as well as a PR, index 0 is the change set, so the PR at index 1 is never se

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/22) · 2026-08-09 · closed · 2 comments

### Add a bounded wait-for-completion tool so clients stop hand-rolling poll loops

**What's the problem?**

Driving a task to completion currently takes an LLM client through a stateful multi-turn loop: `jules_create_session`, then repeated `jules_get_status`, deciding each time whether the state is terminal, then `jules_list_activities` or `jules_get_session_output` at the end. Every poll is a full round-trip through the model, so the token cost scales with session length, and models are unreliable at keeping this kind of loop going — they stop early, forget the session ID, o

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/10) · 2026-08-06 · closed · 2 comments

### Merge formatSourceSummary and formatSource in sources/format.ts

**What's the problem?**
`formatSourceSummary` (src/resources/sources/format.ts:3-9) and `formatSource` (31-40) both render owner/repo + branches; the summary is a trimmed version of the full render.

**Proposed solution**
One `formatSource(source, {summary?: boolean})`. Est. -5 lines.

**Alternatives considered**
None — straightforward merge, low risk.

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/68) · 2026-08-24 · closed · 0 comments

### Deduplicate terminal-state logic across sessions/tools.ts and sessions/format.ts

**What's the problem?**
Three separate places encode "which session states are terminal" and what to say about them, with no shared source of truth:

1. `pollSession`'s inline array in `src/resources/sessions/tools.ts:62-68` — `["COMPLETED","FAILED","AWAITING_PLAN_APPROVAL","AWAITING_USER_FEEDBACK","PAUSED"]`
2. `formatStateGuidance`'s switch in `src/resources/sessions/format.ts:76-95` — the same 5 terminal cases (plus `QUEUED`/`PLANNING`/`IN_PROGRESS` folded into one non-terminal branch), each 

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/67) · 2026-08-24 · closed · 0 comments

## Most recent

### Collapse 7 error subclasses into one parametrized JulesApiError

**What's the problem?**
5 of the 7 classes in `src/core/errors.ts` (`JulesAuthError`, `JulesNotFoundError`, `JulesServerError`, `JulesClientError`, `JulesNetworkError`) are byte-identical: `extends JulesApiError { constructor(m){ super; this.name="…"; } }` (5-48). Only `JulesRateLimitError` (adds `retryAfterMs?`) and `JulesResponseValidationError` (adds `path`, `zodError`) carry extra data.

**Proposed solution**
One `class JulesApiError extends Error { kind; status?; retryAfterMs?; path?; zodEr

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/66) · 2026-08-24 · closed · 0 comments

### Decide: keep or drop undici proxy support in http-client.ts

**What's the problem?**
`undici ^8.9.0` is the sole third-party runtime dependency beyond the MCP SDK + zod (package.json:51), and it's imported only for the HTTP proxy path in `src/core/http-client.ts`: `undiciFetch` (line 1), `proxyDispatcher` (22-26, gated on `PROXY_ENV_VARS` line 8), `currentFetch` (29-31). A 12-line doc comment (10-21) already explains why the proxy dispatcher has to come from undici's own fetch rather than the platform one — that reads as a deliberate decision to keep prox

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/65) · 2026-08-24 · closed · 0 comments

### Extract shared try/catch wrapper for tool handlers

**What's the problem?**
`try { … } catch (error) { return errorResult(\`Error …: ${formatErrorForUser(error)}\`); }` repeats across all handlers in `src/resources/sessions/tools.ts`, `src/resources/activities/tools.ts`, and `src/resources/sources/tools.ts` (15 handlers total: sessions=12 minus `waitForSession`, which delegates to `pollSession` and carries no try/catch of its own — `pollSession` has two of the pattern internally instead; activities=2; sources=2). Only the label string differs.

*

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/64) · 2026-08-24 · closed · 0 comments

### Dedupe session-request build + catch text in sessions/tools.ts

**What's the problem?**
The full session-create request builder is duplicated between `createSession` (src/resources/sessions/tools.ts:129-138) and `executeAndWait` (192-201): identical `source` interpolation, identical `title` fallback (`${repoName}: ${prompt.slice(0,50)}`), identical `requirePlanApproval` / `automationMode` handling. The same 2-line catch message ("Common issues:\n- Repository not connected…") is also pasted into both (146-148, 206-208).

**Proposed solution**
Extract `buildSe

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/63) · 2026-08-24 · closed · 0 comments

### Collapse triple parallel activity-format branches in activities/format.ts

**What's the problem?**
`summaryText` (src/resources/activities/format.ts:119-135), `detailText` (147-178), and `listItemText` (200-237) each walk the same 9 activity sub-fields in the same order (`planGenerated / planApproved / agentMessaged / userMessaged / progressUpdated / sessionCompleted / sessionFailed / artifacts / description`) and have never diverged. They already share `formatPlanSteps` and `formatArtifactBullets`, so the three chains are pure duplication dressed as "styles."

**Propo

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/62) · 2026-08-24 · closed · 0 comments

### Sanitize/truncate raw API responses before returning to the model

### Problem
Tool responses currently pass through raw Jules API payloads. Depending on what's in session prompts, activity logs, or output, that could include sensitive data (credentials pasted into a prompt, internal file contents, etc.) that ends up verbatim in the calling model's context.

### Proposal
Add a sanitization step applied to raw API responses before they're returned, truncating overly long fields and redacting obvious secret-shaped patterns (API keys, tokens, etc.).

### Value
Sec

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/59) · 2026-08-23 · open · 0 comments

### Extend auto-pagination to sources and activities listings

### Problem
`jules_list_stuck_sessions` already auto-paginates internally so callers get a complete result without manually following page tokens. `jules_list_sources` and `jules_list_activities` don't, callers have to paginate themselves.

### Proposal
Add auto-paginating variants (or make pagination-following the default) for sources and activities listings, reusing the pagination logic already built for stuck-session detection.

### Value
Consistency across the tool surface, removes a rough e

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/58) · 2026-08-23 · open · 0 comments

### Add bulk/batch session creation

### Problem
Creating the same task across multiple repositories currently means N separate `jules_create_session` calls from the client.

### Proposal
Add a tool (e.g. `jules_bulk_create_sessions`) that accepts a list of sources/prompts and creates a session per entry server-side, returning all resulting session IDs/status in one response.

### Value
Useful for fan-out workflows, e.g. opening the same fix or dependency bump across several repos in one call instead of round-tripping per repo.

##

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/57) · 2026-08-23 · open · 0 comments

### Add repository allowlist guardrail for session creation

### Problem
Any repo connected as a Jules source can currently have sessions created against it through this server, there's no way to restrict scope when the underlying API key has broad access.

### Proposal
Add an optional allowlist (e.g. an env var listing permitted `owner/repo` entries) checked before `jules_create_session` runs, rejecting the call with a clear error if the target repo isn't on the list. Should be opt-in, no allowlist configured means no restriction (current behavior).

###

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/56) · 2026-08-23 · open · 0 comments

### Add recurring/scheduled session creation (cron-based)

### Problem
Every session today is created ad hoc via `jules_create_session`. There's no way to set up a standing job ("run lint fixes every Monday", "nightly dependency audit") without external scheduling infrastructure sitting outside this server.

### Proposal
Add a tool (e.g. `jules_schedule_recurring_session`) that accepts a cron expression plus the same inputs as `jules_create_session`, and a lightweight local scheduler that persists schedules across server restarts and fires session creat

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/55) · 2026-08-23 · open · 0 comments

### Add codecov.yml with coverage thresholds

There's no codecov.yml in this repo, so Codecov runs on its bare defaults: the `project` check fails on *any* coverage decrease, with zero tolerance. This tripped PR #49, where new code was fully covered but overall coverage dipped 0.16% just from a larger denominator.

testcontainers-moto already has a working codecov.yml to model this on:

```yaml
coverage:
  status:
    project:
      default:
        target: 85%
        threshold: 0%
        informational: true
    patch:
      default:
    

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/50) · 2026-08-22 · closed · 0 comments

### Session watcher does not re-notify after a session leaves and re-enters a stuck state

PR #45 implements deduplication with `seenStates`, but `pollStuckSessions` only updates the map when a webhook succeeds for a currently stuck session. It never records or clears a session when it is observed in a non-stuck state.

Reproduction:
1. Poll session `s` in `AWAITING_PLAN_APPROVAL`: webhook is sent and `seenStates.set("s", "AWAITING_PLAN_APPROVAL")`.
2. Poll `s` in `IN_PROGRESS`: it is filtered out, but the old map entry remains.
3. Poll `s` in `AWAITING_PLAN_APPROVAL` again: `prevStat

[Read the thread](https://github.com/georgeracu/google-jules-mcp-server/issues/48) · 2026-08-22 · open · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/georgeracu/google-jules-mcp-server/issues).
