Jules MCP Server
MCP server that exposes Google Jules capabilities using @google/jules-sdk. This unified implementation uses the SDK plus direct API calls where needed, while keeping SDK-backed caching, snapshots, and artifact handling. MCP tools may use either the SDK or the REST API, whichever is the best fit for the specific operation.
Setup
- Install dependencies
- Provide
JULES_API_KEYvia environment or~/.jules/config.json - Build the server
npm install
npm run build
Run locally:
JULES_API_KEY=your_api_key node dist/cli.js
OpenCode Integration
This repo includes a project-level OpenCode config at .opencode/opencode.json. For global setup, add to ~/.config/opencode/opencode.json (update the command path to where you built this server):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"jules": {
"type": "local",
"command": ["node", "/path/to/your/jules-mcp/dist/cli.js"],
"environment": {
"JULES_API_KEY": "your_api_key"
}
}
}
}
Antigravity Integration
Example OpenCode plugin enablement snippet (merge into your config):
{
"$schema": "https://opencode.ai/config.json",
"plugins": {
"opencode-antigravity-auth": {
"enabled": true
}
}
}
Tools
SDK Tools
| Tool | Purpose | Key Params | Returns |
|---|---|---|---|
create_session | Create a new Jules session or automated run (supports repoless sessions). | prompt (req)repobranchinteractiveautoPr | Session created. ID: <sessionId> |
list_sessions | List recent sessions with pagination. | pageSizepageToken | { sessions: [...], nextPageToken? } |
get_session_state | Session dashboard (status, last activity/message, pending plan). | sessionId (req) | Status object with activity/message/plan context |
send_reply_to_session | Approve plan, send a message, or ask and wait for a reply. | sessionId (req)action (approve/send/ask)message (send/ask) | Confirmation or agent reply |
get_code_review_context | Summarize code changes with file list and metadata. | sessionId (req)activityIdformatfilterdetail | Formatted summary string |
show_code_diff | Get the unified diff for a session or file. | sessionId (req)fileactivityId | Unified diff text |
query_cache | Query the local cache using JQL. | query (req) | { results: [...], _meta? } |
Query example:
{
"query": {
"from": "sessions",
"where": { "state": "failed" },
"limit": 5
}
}
Additional Tools (jules_*)
These tools are part of the same unified server and expose REST-style workflows plus convenience operations. They may use the SDK or the REST API under the hood, depending on which path is required for the operation. They return a structured ToolResult object:
{ success, message, data?, error?, suggestedNextSteps? }
| Tool | Purpose | Key Params | Notes |
|---|---|---|---|
jules_list_sources | List connected repositories. | pageSizepageToken | Returns { sources, hasMore, nextPageToken } |
jules_get_source | Get details for a connected repository. | source (req) | Accepts sources/github/owner/repo or owner/repo |
jules_create_session | Create a session with automation settings. | prompt (req)repo (req)branchtitleautomationModerequirePlanApproval | Draft PR falls back to AUTO_CREATE_PR if not supported |
jules_get_session | Get session status/details. | sessionId (req) | — |
jules_list_sessions | List sessions with pagination. | pageSizepageToken | — |
jules_approve_plan | Approve a pending plan. | sessionId (req) | — |
jules_reject_plan | Reject a plan with feedback. | sessionId (req)feedback | Uses REST endpoint |
jules_send_message | Send a message to a session. | sessionId (req)message (req) | — |
jules_cancel_session | Cancel a running session. | sessionId (req) | Uses REST endpoint |
jules_list_activities | List activities in a session. | sessionId (req)pageSizepageToken | — |
jules_get_latest_activity | Get most recent activity. | sessionId (req) | — |
jules_get_session_plan | Get latest plan (if generated). | sessionId (req) | Plan rejection detection uses REST activity listing |
jules_wait_for_completion | Wait for completion or timeout. | sessionId (req)timeoutMspollIntervalMs | — |
jules_wait_for_plan | Wait for plan generation. | sessionId (req)timeoutMs | — |
jules_create_and_wait | Create and optionally wait for completion. | prompt (req)repo (req)branchtitleautomationModewaitForCompletiontimeoutMsrequirePlanApproval | Draft PR falls back to AUTO_CREATE_PR if not supported |
jules_quick_task | Create session with defaults and wait. | prompt (req)repo (req)branchcreatePr | — |
jules_get_session_summary | Combined session + activity summary. | sessionId (req) | — |
jules_sync_local_codebase | Apply Jules diff to a local git repo. | sessionId (req)repoPathactivityIdfiledryRunallowDirtyautoStashthreeWay | Refuses dirty trees by default unless allowDirty=true or autoStash=true |
Hidden Tool (Not Listed in MCP)
| Tool | Purpose | Key Params | Notes |
|---|---|---|---|
get_bash_outputs | Get bash command outputs from a session. | sessionId (req)activityIds | Not listed in MCP discovery |
Behavior Notes
AUTO_CREATE_DRAFT_PRis not supported by the SDK. When requested forjules_create_sessionorjules_create_and_wait, the server retries withAUTO_CREATE_PR.jules_reject_planandjules_cancel_sessionuse direct REST endpoints when the SDK does not expose public helpers.- Plan rejection status depends on a
planRejectedactivity; if the API does not emit it, the status remainspending_approval. jules_sync_local_codebaseapplies patches viagit applyand refuses dirty working trees unlessallowDirty=trueorautoStash=true.
Configuration
The server reads configuration from:
JULES_API_KEYenv var or~/.jules/config.json- Optional overrides:
JULES_API_BASE_URLJULES_API_TIMEOUTorJULES_REQUEST_TIMEOUT_MSJULES_POLL_INTERVALJULES_RATE_LIMIT_MAX_RETRY_MSJULES_RATE_LIMIT_BASE_DELAY_MSJULES_RATE_LIMIT_MAX_DELAY_MS
CLI
The CLI supports doctor and config commands (like the official SDK MCP):
# Check environment and API connectivity
jules-mcp-server doctor
# Save API key to ~/.jules/config.json
jules-mcp-server config --key YOUR_KEY
Credits
Special thanks to David East for building the SDK and API on which this MCP is based.