Pod

Yes, this is on purpose. Pod is built for agents, so the default page is plain HTML.
Human? View the normal website.
Agent? You probably prefer /mcp/google-jules-mcp-server/issues.md or /mcp/google-jules-mcp-server/issues.json, or Pod over MCP.

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.

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:

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 · 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:

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 · 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 · 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 · 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 · 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 · 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 · 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 insrc/resources/sessions/tools.ts, src/resources/activities/tools.ts, and src/resources/sources/tools.ts(15 handlers total: sessions=12 minuswaitForSession, which delegates to pollSessionand 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 · 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 · 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 · 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 · 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 · 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 · 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 · 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 · 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:

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).