Hexis
Git-backed platform for skills, tools, and context for AI agents
Connector by Bevel-Software · GitHub account verified by the MCP Registry
Install
Works with Claude Code, VS Code, Cursor, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install connector/bevel-software-hexis
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Remote endpoint
https://demo.bevel.software/api/mcpRemote (HTTP)
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: version-control, knowledge-base
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 16 read · 16 write · 3 delete · 4 not yet classified
- Secrets
- None asked for
- Install scripts
- Nothing to install (hosted)
- Runs as
- Hosted (remote endpoint)
Tools by what they do 39
Read from the source code; the running server may list different tools.
Read 16 · Look things up without changing anything.
branch_statuscompare_filefile_statget_change_requestgreplist_brancheslist_change_request_fileslist_change_request_reviewslist_change_requestslist_file_changeslist_fileslist_tools
Show 4 more tools
read_fileread_file_attools_infounzip
Write 16 · Create, change, send or run things.
apply_file_uploadcall_tool_chaincommit_changecreate_branchedit_filemerge_branchmkdirmove_filerequest_file_downloadrequest_file_uploadsave_fileshare_current_branch
Show 4 more tools
update_branchupdate_change_requestwrite_filewrite_files
Delete 3 · Delete, drop, revoke or wipe things.
delete_branchdelete_filedelete_folder
Not yet classified 4 · We could not tell from the name and description.
copy_filehexis_unavailableopen_change_requestswitch_branch
Network hosts it talks to 1
demo.bevel.software· found in remote endpoint, install command
Tools (39)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
apply_file_uploadLand a file you have already uploaded (see `request_file_upload`) in a folder on a branch, in ONE commit, as you. A single file lands under the name it was sent with; a zip lands as its entries, keeping their folder structure. Returns `{ destination, count, total, files }`: one entry per path, each `{ path, outcome }` — `created` / `replaced` / `updated`, or `refused` with `error` (the code) and `message` (why). `count` is how many landed and `total` how many paths there were; `files` is cut to the first 25 unless you pass `all: true`. Every path is judged one by one — by your write access, th…
branch_statusWhere `branch` stands, before proposing or syncing a draft. Answers whether it is on the shared repository, how far ahead of and behind its upstream it is, whether the shared branch has commits this workspace lacks (`behindRemote`: `update_branch` brings them in), the files written but not committed yet, the protected branch it was forked from (`forkBase`), and `changedPaths`: what it changes against `base` (default: the fork base) — the files a change request into it would carry.
call_tool_chainDescription is built at runtime.
commit_changeSave the currently-pending file edits as a new change on the current branch. Each change must affect exactly one file — if multiple files are dirty, returns a structured error listing them; commit them one at a time. Refused on protected branches without write permission.
compare_fileThe unified diff of one file: between two branches (`from`, `to`; either may be `branch` itself), or of one commit on `branch` (`at`: what that commit changed in the file). Empty when identical. Takes the read the file takes on each side.
copy_fileCopy a workspace FILE to a new path. The destination must not exist — like a move, a copy never overwrites a file or a folder; to change what is in a file that already exists, write it. Committed + pushed as you. Preflight first: `dryRun: true` changes nothing and answers `{ src, dest, kind, descendants, access: { before, after }, accessChanges, allowed, reason? }` — `access` is your own `{ read, write, download, owner }` at the source and at the destination AS IT WILL BE once the copy has landed, with every `access.md` inside a copied folder counted at its new place. One exception to that sha…
create_branchDescription is built at runtime.
delete_branchDelete branch `name` from the shared repository and the server. Allowed for the branch's author (`<email-localpart>/…`, or your own `suggestions/…` bundle) or an Admin. Refuses a protected branch, a name that is not a branch, a branch with saves still landing or a file held (retry once they land). An open change request from or into it that proposes nothing is closed and the delete goes ahead; one that still proposes something refuses it, naming and linking it: its author withdraws it or an Admin declines it, in the app (one you cannot see is not named, nor in a preview). Refuses a branch hold…
delete_fileDelete ONE workspace file. Committed + pushed as you. Its folder stays, even when this was its last file. Files only: a folder is refused with a pointer to `delete_folder`.
delete_folderDelete a workspace FOLDER and every file under it, at any depth; the whole folder lands as ONE committed + pushed change as you — all of it or none of it — then the empty folder is removed. This is the one way a folder goes away: the folder that held it stays, even if this was all it had, and a folder holding nothing but its empty-folder placeholder counts as empty. The dry run answers `{ path, kind: "folder", descendants, files, filesTruncated, allowed, reason? }` — `descendants` is the file count, `files` names up to 100 of them — and a non-empty folder wants `confirm: true`. Beyond what the…
edit_fileReplace an exact string in a workspace TEXT file. `old_string` must appear exactly once unless `replace_all`. Committed + pushed as you. Large, escape-heavy or binary content does not go through here: use `request_file_upload` + `apply_file_upload`.
file_statGet a file/directory's metadata (name, type, size, …) without returning content, and what you may DO with it. A file also reports `contentMode`, `kind`, `mime`, `mimeSource` and `textEditable` — decided by the same readers read_file, grep and the write tools use, so an extensionless text file is `text/plain`. `access: { read, write, download, owner }` is your own verdict under the access rules; pass `explainAccess: true` to learn why, and who else holds each verb. Call this before a move or delete: `managed`, `movable` and `deletable` answer the shared rules on what these tools never move or d…
get_change_requestRead one change request by `number` (GitHub: get a pull request) — its `url`, `title`, `body` (what the author wrote, without the generated owners block Hexis appends), `state`, `sourceBranch`, `targetBranch`, whether it is `mergeable`, the `mergeBlockedReasons` holding it up, and a `viewer` block saying whether YOU may approve or apply it. The same field names `open_change_request` answers in. Read-only. Answers 404 both for a number that does not exist and for a request you may not see.
grepRegex search across the workspace. Returns `{ matches: [{ path, line, text }] }` (capped). Use to find where something is defined/referenced. `path` may name a DIRECTORY (searches the subtree) or a single FILE (searches just that file); a path with nothing at it is an error, never an empty result. Searches INSIDE Office and OpenDocument files (.docx/.pptx/.xlsx, .odt/.odp/.ods), PDFs and email files (.eml/.msg) via their extracted text — matches there carry the extraction's line numbers, and the `[slide N]`/`[sheet: Name]`/`[page N]`/`[from]`/`[subject]` marker lines locate them; a bounded num…
hexis_unavailableDescription is built at runtime.
Show 24 more tools
list_branchesList every draft known to the repository (protected versions + unprotected drafts, local and on the shared remote). Returns `{ branches: [{ name, isProtected, ahead, behind, hasRemote }] }`. Takes no arguments — branch listing is repo-global, not scoped to any one draft.
list_change_request_filesList a change request's changed files (GitHub: list pull request files). Each answers `path`, `change` (`added`, `changed`, `deleted` or `moved`, a moved one with its `previousPath`), `additions` and `deletions` — the same words `open_change_request` uses — plus who must approve it (`requiredApprovers`) and who has (`approvedBy`). No patch is returned unless you ask with `include: ["patches"]`. Read-only. Files you may not read are left out and counted in `withheldFiles`, never named.
list_change_request_reviewsList a change request's reviews (GitHub: list reviews): who approved what, and when. Hexis approves per FILE, so each entry names a `reviewer`, the `files` they approved and the time of the latest of them; `stale` is true for approvals a later push invalidated. Nothing records who DECLINED a request, so no entry reports one. Read-only: an entry keeps only the files you may read, and one with no readable file at all is counted in `withheldReviews` rather than named.
list_change_requestsList change requests (GitHub: list pull requests), newest first. Filter by `state` (`open`, the default, `closed` — which covers applied and declined alike — or `all`), `head` (source branch), `base` (target branch) and `author` (an email or a `login`). Each answers in Hexis's own words: `url`, `number`, `title`, `state` (`open`, `merged` or `closed`), `sourceBranch`, `targetBranch`. Read-only, and limited to what you may read: a request whose files are all closed to you is not listed unless you opened it, and `withheldFiles` counts the ones left out of each.
list_file_changesThe history of one file on `branch`: its commits, newest first — who made each, when, and its subject — as the app's History tab shows them. `limit` caps the list (default 20, at most 100). Read a version with `read_file_at` and its diff with `compare_file`. Takes the read the file itself takes; a folder has no history of its own (ask per file).
list_filesDescription is built at runtime.
list_toolsDescription is built at runtime.
merge_branchMerge branch `source` into branch `target` as you, and publish `target`. An agent proposes and syncs; a person merges: this tool never lands a change request. It refuses while a change request from `source` into `target` is open (naming it): ask the user to review it in the app. It refuses when `target` is a protected branch unless you could commit every changed file directly to it. SYNC: merging the target into your draft (`source` = the change request's target, `target` = your draft) is always allowed, even with the draft's request open. Writes are committed asynchronously; the merge first w…
mkdirCreate a directory (recursive). It lists as an empty folder and persists in git until it is deleted explicitly.
move_fileMove or rename a workspace FILE or FOLDER; a folder moves recursively, with everything under it. `dest` is the full new path, not the folder to move into. Committed + pushed as you. The destination must not exist — a move never overwrites a file or merges into a folder. Access follows the DESTINATION folder, so a move can change what you (and others) may do with the file: the dry run answers `{ src, dest, kind, descendants, access: { before, after }, accessChanges, allowed, reason? }`, where `access` is your own `{ read, write, download, owner }` at the source and at the destination AS IT WILL…
open_change_requestDescription is built at runtime.
read_fileRead a workspace file as text. Returns `{ path, content, canWrite }`. Per the shared content rule: text as text, documents and email as extracted text, an image as the picture, anything else as a one-line description. Also reads a `__tool_chain_spill__/…` ref back from a truncated `call_tool_chain`: it belongs to no workspace, so `branch` is ignored and no `canWrite` comes back. `offset`/`limit` slice the content (characters; bytes for a spill ref; ignored for an image): page through large files and spills, never read multi-MB whole. `canWrite`: may you change this file directly on the default…
read_file_atOne file as it was at a point in history: `at` is a commit (from `list_file_changes`, on `branch`'s own history) or the name of another branch (its published tip). Answers `content` (null when the file was not there) and `sha`, the commit it was read at; for a commit, also `before`, the file just before that commit. To put an earlier version back, write it with `write_file`. Takes the read the file takes at that point.
request_file_downloadDescription is built at runtime.
request_file_uploadAsk for a one-time address to send FILE BYTES to, so their content never passes through this conversation. Use it for anything `write_file` cannot carry faithfully: a large file, a file full of backslashes or `\u` escapes, a binary file (a PNG, a PDF, a zip), or many files at once (zip them). Returns `{ uploadUrl, token, expiresAt, expiresInSeconds, maxBytes }`. THEN: (1) POST the file as the raw request body to `uploadUrl` with `?filename=<name>` — `curl -X POST --data-binary @skill.zip "<uploadUrl>?filename=skill.zip"` — which answers what it received; (2) call `apply_file_upload` with the s…
save_fileSchedule the file at <path> for commit + push using whatever bytes are on disk (no content rewrite) — for binary uploads or files left uncommitted. On lock contention returns `{ saved: false, reason }` rather than throwing. The commit lands asynchronously.
share_current_branchPublish the current branch to the shared remote so teammates and any change request pick up your commits. No arguments. Refused on protected branches without write permission.
switch_branchSwitch the agent to a different draft for the NEXT user turn. The current turn finishes on the original draft (writes from this point still land there), so finish anything important first. Validates the target exists (use list_branches if unsure) and pre-warms its clone; the frontend navigates on turn completion. After calling, summarise the switch and stop.
tools_infoGet full TypeScript interface definitions for named tools (names from `list_tools`). The schemas are the source of truth — do not guess shapes.
unzipExtract a .zip already in the workspace (defaults to the zip's parent). Returns extracted files + skipped entries. Existing files are overwritten.
update_branchBring another branch into `branch` as a merge commit by you, and publish it: `from` (a draft's target, to refresh the draft), or left out, the branch's own shared state when it moved while this workspace held commits (`branch_status` says `behindRemote`). Never a protected branch. CONFLICTS: the first call answers `conflicts` naming every conflicted path with the file at the merge base, on each side (`ours` = `branch`, `theirs` = `from`) and the working copy with git's markers, and leaves the branch as it was. Decide each file (keep both sides' information unless one is clearly stale; `list_fi…
update_change_requestChange the title and/or the description of an OPEN change request. Allowed for its author and for anyone who may merge it (an admin, or someone who may approve every file it changes) — the same rule as the app's Edit control; anyone else is refused (403), and so is a merged or closed request (409), in words. `description` replaces the request's description whole — the text `get_change_request` answers as `body`; `appendDescription` instead adds a paragraph after the description as it stands when the write happens, so two notes racing each other both land (never together with `description`). Gi…
write_fileWrite a workspace TEXT file. The change is committed + pushed as you. Returns `{ path, bytes, outcome }`, where `outcome` is `created`, `replaced` or `updated`. Large, escape-heavy or binary content does not go through here: use `request_file_upload` + `apply_file_upload`.
write_filesBatch-write many files in ONE commit — far faster than calling write_file once per file when creating many files at once (e.g. seeding a knowledge base). Each entry is `{ path, content }`, and the files it writes are committed + pushed together as you. Prefer this over many write_file calls. Text files only. Returns `{ count, files }`: one entry per REQUESTED path, in the order you gave them, each `{ path, outcome }` — `created` / `replaced` / `updated` for a path it wrote, or `refused` with `error` (the code) and `message` (why) for a path it could not. `count` is how many were written. A pat…
Signals
- Stars
- 119
- Forks
- 16
- Open issues
- 0
- Last commit
- Oct 22, 2026 (6 days ago)
- Last release
- Oct 19, 2026 (9 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.Bevel-Software/hexis- Version
- 0.1.0
- Auth
- Auth not stated
- License
- Apache-2.0
- Repository
- github.com/Bevel-Software/Hexis
- First seen
- Oct 24, 2026
- Last checked
- Oct 25, 2026
Cite this page
Hexis MCP server. Agent Mart. https://agentmart.dev/connectors/bevel-software-hexis (last updated 2026-10-25)