JarelaBLOCK
Jarela is a lightweight, full‐featured multi‐agent application that runs locally on your machine.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Jarela is a local-first desktop UI for orchestrating LangGraph agents on your own machine. It keeps agent state, memory, schedules, and model/tool configuration in SQLite under a local data directory, with no hosted backend required.
Highlights
- Local-first, single-process Next.js app
- Multi-provider LLM support: Anthropic, OpenAI, Google GenAI, Cohere, DeepSeek, GitHub Copilot
- Per-agent tool policy, identity, memory, and harness configuration
- SQLite-backed checkpoints, memory, schedules, proposals, and local integrations
- Durable, agent-targeted lifecycle signals for restarts, approvals, configuration changes, and background work
- PWA / desktop-friendly workflow with browser extension support
- MCP, integration manifests, and built-in tool extension points
Quick start
npm install npm run dev
Then open http://127.0.0.1:4312.
Documentation
Full docs are organized under the docs site and source docs folder:
- Live documentation site
- Docs home
- Install guide
- Development guide
- Architecture
- Extending Jarela
- API reference
- Contributing
Runtime and architecture
The app is built around a single Next.js process with clear layers:
- app + API routes
- agent runtime + prompt assembly
- provider adapters
- tools + MCP registry
- SQLite persistence and memory stores
- integrations, bridges, scheduler, and browser extension surfaces
- SQLite outbox and leased signal delivery, consumed by the existing agent run queues (no additional broker)
Extension surfaces
Jarela supports explicit extension points for:
- built-in LLM providers
- external provider plugins
- built-in tools
- MCP servers
- custom harnesses
- integration manifests
- app branding / runtime config
Use the agent tool describe_extension_surfaces and the docs guide for th
3ae0d81f68aaOBSERVED · 2026-10-12Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add jarela-oauth-proxy --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env ANTHROPIC_AUTH_TOKEN=${ANTHROPIC_AUTH_TOKEN} --env ATLASSIAN_API_TOKEN=${ATLASSIAN_API_TOKEN} --env CODEX_API_KEY=${CODEX_API_KEY} -- npx -y [email protected]{
"mcpServers": {
"jarela-oauth-proxy": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
"ANTHROPIC_AUTH_TOKEN": "${ANTHROPIC_AUTH_TOKEN}",
"ATLASSIAN_API_TOKEN": "${ATLASSIAN_API_TOKEN}",
"CODEX_API_KEY": "${CODEX_API_KEY}"
}
}
}
}Exposed tools (200)
155 read · 78 write · 29 destructive. Blast radius: 29 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
API | read | REST |
Acme | read | d |
Default | read | Evidence-first scaffolding: retrieval-grounded planning, anti-fabrication output discipline, and self-config proposals. |
Done | read | completed |
Highest | read | |
Platform | read | core infra |
browser_activate_tab | read | Focus a browser tab by |
browser_click | read | Click an element in the active tab. Identify the target with EXACTLY ONE of: |
browser_extract | read | Read text or HTML from the active tab. Without |
browser_fill | read | Type |
browser_fill_many | read | Fill multiple fields in the active tab in one browser round-trip. Use this for forms after a |
browser_navigate | read | Drive the user |
browser_screenshot | read | Take a screenshot of the active tab and store it as a local file. Returns a |
browser_scroll | read | Scroll the active tab. |
browser_snapshot | read | Return a compact, structured map of the active tab — URL, title, headings, landmarks, and a numbered list of every interactive control (links, buttons, inputs, selects, etc.) with |
browser_tabs | read | List browser tabs known to the Jarela extension, including tab id, window id, active/focused/pinned/foreground markers, title, URL/host when permissions allow, and whether the tab can be scripted. |
calendar_create_event | write | Create a Google Calendar event on a calendar (default: |
calendar_delete_event | destructive | Delete a Google Calendar event by id. Attendees are notified by default. |
calendar_get_event | read | Fetch one Google Calendar event by id. Returns the same slim shape as |
calendar_list_calendars | read | List the user |
calendar_list_events | read | List events on a calendar within a time window. Defaults: primary calendar, |
calendar_update_event | write | Patch a Google Calendar event. Only the fields you supply are changed; |
cancel_scheduled_task | read | Cancel a previously scheduled task by id. |
cancel_watcher | read | Cancel a previously registered watcher by id. |
check_proposal | read | Check the status of a previously-submitted config-change proposal by its id. |
claude_delegate | read | Delegate a feature-scoped coding task to a local Claude Code CLI process with full tool access (Read, Write, Edit, Bash, Skill, WebSearch, etc.), running inside the active workspace (call workspace_init first). |
claude_delegate_status | read | Poll or cancel a background claude_delegate job. Agent-owned jobs return bounded status/step counts and result_key; use tool_result_get for encrypted terminal output. Legacy unowned jobs return steps/new_steps and the synchronous result shape. Use action: |
codex_delegate | read | Delegate a focused coding task to the locally installed OpenAI Codex CLI. Call workspace_init with the target repository before this tool, or pass cwd explicitly; do not use Jarela |
compact_context | read | Summarize and fold the earlier conversation out of the hot context so the next turns start fresh. |
confluence_add_comment | write | Add a footer comment to a Confluence page (v2). Pass exactly one of |
confluence_add_label | write | Add one or more labels to a Confluence page (additive — does not replace existing labels). |
confluence_create_page | write | Create a Confluence page (v2). Pass |
confluence_delete_attachment | destructive | Delete a Confluence attachment by id (v2). Default soft-deletes (trash, restorable). Pass |
confluence_delete_comment | destructive | Permanently delete a Confluence comment (v2). Pass |
confluence_delete_page | destructive | Delete a Confluence page (v2). Default soft-deletes (page goes to trash, restorable). |
confluence_get_attachment_content | read | Fetch an attachment |
confluence_get_comments | read | List footer comments (and inline comments by default) on a Confluence page. Returns id, |
confluence_get_labels | read | List labels on a Confluence page (cursor-paginated). Default limit 50 (max 250). |
confluence_get_page | read | Fetch a Confluence page by id (v2). Returns title, space_id, parent_id, version, and BOTH |
confluence_get_page_ancestors | read | Return the parent chain (root → leaf) for a Confluence page. Useful for breadcrumbs and |
confluence_get_page_by_title | read | Find Confluence page(s) by exact title within a space. Auto-resolves |
confluence_get_page_children | read | List direct children of a Confluence page (cursor-paginated). Pass |
confluence_list_attachments | read | List attachments on a Confluence page (cursor-paginated). Returns id, title, media_type, |
confluence_list_spaces | read | List Confluence spaces (cursor-paginated). Returns id, key, name, type, status, homepage_id. |
confluence_move_page | write | Reorder/reparent a Confluence page (v2). |
confluence_remove_label | destructive | Remove a single label from a Confluence page. Uses the v1 endpoint (v2 Label group is still |
confluence_search | read | Search Confluence pages with CQL (Confluence Query Language). |
confluence_update_comment | write | Edit an existing Confluence comment (v2). Pass |
confluence_update_page | write | Update an existing Confluence page (v2). Pass exactly one of |
confluence_upload_attachment | write | Attach a file to a Confluence page. Pass content_base64 for binary or content_text for plain |
contract_output | read | Synthetic output |
cred_tool | read | needs a key |
delegate_to_agent | read | Hand a subtask to another agent that has specialized knowledge or tools you lack. |
describe_extension_surfaces | read | Return the curated catalog of every extension surface in this app — |
describe_provider | write | Return capability flags (chat / invoke / stream / embed / list_models) |
documents_add_local_source | write | Add a local folder as a Documents source so its files become searchable via documents_search. |
documents_add_remote_source | write | Add a Jira project / JQL query / Confluence space / CQL query / GitHub repo as a document source. |
documents_index_url | read | Fetch and index a single Jira issue, Confluence page, or GitHub PR/issue/file on demand, |
documents_list_sources | read | List the folders Jarela is indexing for document search. Useful before calling |
documents_reindex_source | destructive | Force an immediate incremental sync of a remote document source. Returns counts of added / updated / unchanged docs. |
documents_remove_source | destructive | Delete a document source and all its indexed chunks. Destructive — requires |
documents_search | read | Search indexed local documents (notes, READMEs, code, configs) by semantic similarity. |
echo | read | Echo |
echo-async | read | echo |
echo-stream | read | echoes args |
file_copy | read | Copy a file or directory. If destination is an existing directory, source is copied into it. Directories require recursive=true (default). |
file_delete | destructive | Delete a file or directory. Non-empty directories require recursive=true. Symlinks are not followed. |
file_glob | read | Find files by glob pattern under a directory. Prefer this over shelling out to rg --files/find/Get-ChildItem for file discovery. Supports *, **, ?, and {a,b} alternation. Skips node_modules/.git/dist/build/.next/coverage/etc by default. Returns POSIX-relative paths from the search root. |
file_grep | read | Search file contents under a directory by regex (or literal substring with literal=true). Prefer this over local_exec/terminal grep, rg, Select-String, or Get-ChildItem pipelines for code search. Optional glob filter (e.g. |
file_list | read | List a directory |
file_mkdir | write | Create a directory. Creates parents by default. |
file_move | write | Move or rename a file or directory. If destination is an existing directory, source is moved into it. Handles cross-device moves via copy+remove fallback. |
file_multi_edit | write | Apply multiple anchored str_replace edits to one file atomically. Each edit |
file_read | read | read files |
file_stat | read | Check whether a path exists and return its kind, size, and timestamps. |
generate_image | read | Generate one or more images from a text prompt using Google |
generate_voice | read | Synthesize speech with Google |
get_integration_setup | read | Return the full setup manifest for one integration — prerequisites, ordered steps, and |
get_user_location | read | Get the user |
github_add_comment | write | Post a comment on an issue or pull request (GitHub treats both the same). |
github_create_issue | write | Open a new issue in a repository. **PREFER THIS over shell-exec |
github_create_pull | write | Open a pull request. **PREFER THIS over shell-exec |
github_create_review | write | Submit a pull-request review (approve / request changes / leave a comment). **PREFER THIS over |
github_get_file | read | Read a file |
github_get_issue | read | Fetch a single issue (or PR — same endpoint) by number. Returns body capped at 20KB, plus labels, |
github_get_pull | read | Fetch detail on a single pull request — head/base SHAs, mergeable state, additions/deletions, |
github_get_repo | read | Fetch repo summary (default branch, visibility, description, topics, star/fork counts, |
github_list_branches | read | List branches in a repository with their head SHAs and protection state. **PREFER THIS over |
github_list_issue_comments | write | List comments on an issue or PR. **PREFER THIS over shell-exec |
github_list_pull_files | read | List files changed in a pull request, with per-file additions/deletions and (capped) patch text. |
github_list_pull_reviews | read | List reviews submitted on a pull request (approvals, change-requests, comment-only). **PREFER THIS |
github_list_pulls | read | List pull requests for a repository, optionally filtered by state / head branch / base branch. |
github_merge_pull | write | Merge a pull request. **PREFER THIS over shell-exec |
github_request_reviewers | read | Request review on a pull request from one or more users and/or teams. **PREFER THIS over |
github_search_code | write | Search file contents across GitHub. **PREFER THIS over shell-exec |
github_search_issues | read | Search GitHub issues AND pull requests with the same query syntax as the github.com search bar. |
github_update_issue | write | Edit an issue or PR (same endpoint): change title, body, labels, assignees, or close/reopen via |
github_update_pull | write | Edit a pull request: title, body, base branch, or close/reopen. **PREFER THIS over shell-exec |
gmail_create_draft | write | Create a Gmail draft. Prefer drafts unless the user explicitly asks to send immediately. |
gmail_get_message | read | Fetch one Gmail message by id, including full headers and the decoded text body (text/plain |
gmail_list_labels | read | List all Gmail labels (system + user). System label ids are uppercase (INBOX, UNREAD, |
gmail_modify_message | destructive | Add or remove labels on a Gmail message. Common patterns: |
gmail_search | read | Search the user |
gmail_send_email | write | send mail |
gmail_trash_message | destructive | Move a Gmail message to Trash (reversible for 30 days, not permanent delete). Only call this |
icloud_calendar_create_event | write | Create an event on an iCloud calendar. |
icloud_calendar_delete_event | destructive | Delete an event by UID. For a recurring series this removes every |
icloud_calendar_get_event | read | Fetch a single event by UID, including the raw iCalendar source. |
icloud_calendar_list_calendars | read | List iCloud event calendars (VEVENT collections). Returns the URL |
icloud_calendar_list_events | read | List events in a calendar between two ISO timestamps. The calendar |
icloud_calendar_update_event | write | Patch fields on an existing event. Only the supplied fields are |
icloud_mail_create_draft | write | Save a new draft to the iCloud Drafts folder. This intentionally does |
icloud_mail_delete_message | destructive | Move a message to the iCloud Trash (recoverable for ~30 days, |
icloud_mail_flag_message | destructive | Add or remove standard IMAP flags on a message — typically |
icloud_mail_get_message | read | Fetch a single message by UID. Returns headers, plain-text body, |
icloud_mail_list_folders | read | List iCloud Mail folders (mailboxes) with message + unread counts. |
icloud_mail_list_messages | read | Search messages in an iCloud Mail folder. Returns the most recent |
icloud_mail_move_message | write | Move a message to a different folder. To send a message to trash, |
icloud_reminders_complete | read | Mark a reminder (VTODO) as completed. |
icloud_reminders_create | write | Create a reminder (VTODO) in an iCloud Reminders list. |
icloud_reminders_list | read | List reminders (VTODO items) in a Reminders list. The calendar URL |
icloud_reminders_list_lists | read | List iCloud Reminders lists (VTODO calendar collections). Returns |
invoke_tool | write | Never target invoke_tool itself; call the target tool directly. Execute a permitted tool by name only after list_tools finds a tool that is permitted for this agent but was not directly loaded this turn, especially when permission_reason= |
jira_add_comment | write | Add a comment to a Jira issue. Plain text is auto-converted to ADF (Atlassian Document Format). |
jira_add_remote_link | write | Attach a web/external link to a Jira issue (Confluence pages, GitHub PRs, dashboards, Slack threads, |
jira_add_worklog | write | Log time spent on a Jira issue. time_spent uses Jira |
jira_align_add_comment | write | Post a comment on a Jira Align work item. ** |
jira_align_create_dependency | write | Link two Jira Align work items as a dependency: the predecessor must complete before the |
jira_align_create_entity | write | Create a Jira Align hierarchy entity: program, team, release, sprint (PI), portfolio, or |
jira_align_create_item | write | Create a Jira Align work item in a given type |
jira_align_delete_comment | destructive | Permanently delete a comment from a Jira Align work item. **Irreversible.** ** |
jira_align_delete_dependency | destructive | Permanently remove a Jira Align dependency link. **Irreversible.** Use |
jira_align_delete_entity | destructive | Permanently delete a Jira Align hierarchy entity (program/team/release/sprint/portfolio/ |
jira_align_delete_item | destructive | Permanently delete a Jira Align work item. **Irreversible.** ** |
jira_align_get_entity | read | Fetch a single Jira Align hierarchy entity by id: program, team, release, sprint (PI), portfolio, |
jira_align_get_item | read | Fetch a Jira Align work item by id. **Must specify |
jira_align_list_children | read | List the direct children of a Jira Align work item. **Both |
jira_align_list_comments | read | List comments on a Jira Align work item. ** |
jira_align_list_dependencies | read | List Jira Align dependencies (links between work items) involving a given item. By default |
jira_align_list_entities | read | List non-work-item Jira Align entities of a given type: programs, teams, releases, sprints (PIs), |
jira_align_search_items | read | Search Jira Align work items of a given type, with optional state/owner/program/team |
jira_align_transition_item | write | Move a Jira Align work item to a new workflow state (e.g. |
jira_align_update_comment | write | Edit the body of an existing comment on a Jira Align work item. ** |
jira_align_update_entity | write | Patch fields on a Jira Align hierarchy entity (program/team/release/sprint/portfolio/value |
jira_align_update_item | write | Patch fields on a Jira Align item (title, description, owner, programId, teamId, |
jira_create_component | write | Create a component on a Jira project. assignee_type controls default assignee for issues with |
jira_create_issue | write | Create a new Jira issue. Defaults to issue_type= |
jira_create_issues_bulk | write | Create up to 50 Jira issues in a single API call. Each entry takes the same shape as |
jira_create_sprint | write | Create a future sprint on a board. New sprints always start in |
jira_create_version | write | Create a new version on a Jira project. Pass the project key — we resolve it to the numeric id. |
jira_delete_attachment | destructive | Permanently delete an attachment from a Jira issue by id. **Destructive — no undo.** Look up |
jira_delete_comment | destructive | Permanently delete a comment from a Jira issue. **Destructive — no undo.** Look up the id via |
jira_delete_issue | destructive | Permanently delete a Jira issue. **DESTRUCTIVE — there is no undo from the API.** By default, |
jira_delete_link | destructive | Delete an issue link (Jira-to-Jira, default) or a remote/web link. Look up the id first with |
jira_delete_sprint | destructive | Permanently delete a sprint. **Irreversible** — issues are unassigned from the sprint but the |
jira_find_user | read | Look up Jira Cloud users by email or display-name fragment. Returns accountId values |
jira_get_attachment_content | read | Fetch a Jira issue attachment |
jira_get_board | read | Fetch board metadata and configuration in one call: id, name, type, project_key, plus filter id, |
jira_get_changelog | read | Fetch a Jira issue |
jira_get_comments | read | Paginated comment list for a Jira issue. Use this when an issue has more comments than the |
jira_get_issue | read | Fetch a single Jira issue by key (e.g. |
jira_get_project | read | Fetch a single Jira project by key. Optionally include versions, components, and/or issue types |
jira_get_sprint | write | Fetch a single sprint by id. Returns name, state, goal, start/end/complete dates. Use jira_search |
jira_link_issues | write | Create an issue link between two Jira issues (Blocks, Relates, Duplicates, Cloners, etc.). |
jira_list_boards | read | List Jira agile boards (Scrum or Kanban). Filter by project key, name fragment, or board type. |
jira_list_components | read | List components on a Jira project. Returns id, name, description, lead, default assignee type. |
jira_list_meta | read | List values for a Jira site-wide enum: issue types, priorities, statuses, or resolutions. |
jira_list_projects | read | List Jira projects (paginated). Filter by name fragment via |
jira_list_sprints | read | List sprints on a board. Filter by state ( |
jira_list_versions | read | List versions on a Jira project (paginated). Returns id, name, released/archived flags, dates. |
jira_list_worklogs | read | List worklog entries on a Jira issue (paginated). Returns id, author, time_spent (display string + |
jira_move_issues_to_backlog | destructive | Remove issues from their current sprint and put them back on the backlog. Up to 50 issues per |
jira_move_issues_to_sprint | write | Move issues into a sprint. Up to 50 issues per call. Issues already in another sprint are |
jira_rank_issues | read | Rank up to 50 issues relative to a single anchor issue (before XOR after). Pass |
jira_search | write | Search Jira issues using JQL. **PREFER THIS over shell-exec |
jira_transition_issue | read | Transition a Jira issue |
jira_update_comment | write | Edit an existing comment on a Jira issue. Plain-text body is auto-converted to ADF (same as |
jira_update_issue | write | Edit fields on an existing Jira issue: summary, description, priority, assignee, fix versions, |
jira_update_sprint | write | Update a sprint |
jira_update_version | write | Edit a version: rename, change dates, mark released/unreleased, mark archived/unarchived. |
jira_upload_attachment | write | Upload a file as an attachment to a Jira issue. Pass content_base64 for binary files (PNG, PDF, |
large-async | read | test |
large-json | read | test |
large-text | read | test |
large-text-flat | read | test |
list_harnesses | read | List available agent harness presets with ids, names, default status, builtin/custom source, and enabled sections. Read-only. Use before proposing harness changes. |
list_integrations | write | List every integration Jarela knows how to set up, with a one-line summary and |
list_mcp_servers | read | List every configured MCP server (stdio or http transport) with its |
list_providers | read | List every LLM provider adapter registered in this app (built-in like |
list_reaction_scripts | read | List the names of built-in reaction scripts available to schedule_watcher AND |
list_scheduled_tasks | read | List every scheduled task across all agents. Each row is tagged with |
list_skills | read | List all available skills by ID, name, and description. The same list appears in the system prompt; call this only if you need a refreshed view after writing a skill. |
list_tools | read | List every tool currently available to this agent — built-in tools, |
list_watchers | read | List every event-driven watcher across all agents. Each row is tagged |
mcp_echo | read | Echo via MCP |
memory_delete | destructive | Delete a single memory entry by namespace and key. Returns { removed: true } if a row was removed, { removed: false } if no matching row existed. Bulk deletion by namespace is not supported by this tool — list-then-delete-loop if needed. |
memory_list | read | List memory entries, optionally filtered by namespace. With a search term, matches by meaning and by exact text in keys and values; without one, lists newest first. |
memory_read | read | read memory |
memory_upsert | read | Store a durable, structured memory record for proactive semantic recall. Use namespace= |
memory_write | write | Write or update a value in long-term memory. Use this to remember facts, user preferences, or any information that should persist across conversations. |
Trust audit
BLOCKgrade F · trust 22/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | FAIL |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | FAIL |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (5 observation(s))
- Network
- declared (5 observation(s))
- Shell
- declared (7 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (25)
payload.ts
editor-payload.ts
exec(command: string, timeoutMs = 60_000): Promise<ExecResult> {exec(cmd, (err) => { if (err) console.error("Failed to launch browser:", err.message); });# Claude Code Project Instructions
# Jarela
# Architecture — Jarela
---
---
// Barrel of built-in tool modules. Each side-effect import triggers the
#requires -Version 5.1
const SECRET = "sk-ant-encryption-canary-XYZ"; // jarela-secret-ok
const FAKE_ANT = "sk-ant-abc123def456ghi789jkl000"; // jarela-secret-ok
const FAKE_ANT = "sk-ant-abc123def456ghi789jkl000"; // jarela-secret-ok
const FAKE_ANT_HIGH_ENTROPY = "sk-ant-aB3kQ9vXp2mR7tYn4wL8jH5sZ6cF1dG0"; // jarela-secret-ok
const FAKE_ANT = "sk-ant-abc123def456ghi789jkl000"; // jarela-secret-ok
const SECRET = "sk-ant-encryption-canary-XYZ"; // jarela-secret-ok
const SECRET = "AIza-PRODUCTION-SHAPE";
).run(JSON.stringify({ token: "ghp_legacy_plaintext" }), t, t);createCredential({ id: "integration-github", type: "integration", provider: "github", auth_method: "api_key", params: { token: "ghp_default_was_first" } });calendar_delete_event, confluence_delete_attachment, confluence_delete_comment, confluence_delete_page, confluence_remove_label, documents_reindex_source, documents_remove_source, file_delete, gmail_m
.gcloudignore
payload.test.ts
editor-payload.test.ts
: await exec();
Gates applied: no_behavioural_pass.
3ae0d81f68aafull audit observations/trust-audit/mcp-server/circuitwall__jarela.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-12 | 3ae0d81f68aa | BLOCK | F | 22 | first audit |
Questions
What is the @circuitwall/jarela MCP server?
Jarela is a lightweight, full‐featured multi‐agent application that runs locally on your machine.
What tools does @circuitwall/jarela expose?
200 in total: 155 read-only, 78 that write, and 29 that can delete or overwrite (calendar_delete_event, confluence_delete_attachment, confluence_delete_comment, confluence_delete_page, confluence_remove_label). Every one is listed on this page with its risk.
Is @circuitwall/jarela safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (22/100) and found 9 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 29 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does @circuitwall/jarela need?
It reads ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, ATLASSIAN_API_TOKEN, CODEX_API_KEY, COHERE_API_KEY, DEEPSEEK_API_KEY, FAKE_API_KEY, FAKE_OTHER_TOKEN, FAKE_TEST_KEY_THAT_IS_NEVER_SET, FIRECRAWL_API_KEY, GEMINI_API_KEY and GH_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does @circuitwall/jarela run?
It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as jarela-oauth-proxy at 1.0.0.
How current is this page?
The grade is for one exact copy of the source (3ae0d81f68aa), read on 2026-10-12. The repository is watched and re-audited when it changes.