Gluecron

AI-native git hosting — repos, PRs, issues, CI gates, and AI code review over MCP (60 tools).

Should I use this

Quality & Safety

A
Description quality
96%
Schema completeness
89%
Naming quality
79%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (12)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains suspicious base64-like encoded stringin gluecron_repo_health
  • LOWTool 'gluecron_repo_explain_codebase' description lacks action verbin gluecron_repo_explain_codebase
  • LOWTool 'gluecron_clone_url' description lacks action verbin gluecron_clone_url
  • LOWTool 'gluecron_assign_issue' description lacks action verbin gluecron_assign_issue
  • LOWTool 'gluecron_propose_migration' description lacks action verbin gluecron_propose_migration
  • LOWTool 'gluecron_release_lease' description lacks action verbin gluecron_release_lease
  • LOWTool 'gluecron_get_agent_budget' description lacks action verbin gluecron_get_agent_budget
  • LOWTool 'gluecron_generate_pr_description' name length outside 3-30 rangein gluecron_generate_pr_description
  • LOWTool 'gluecron_atomic_multi_file_commit' name length outside 3-30 rangein gluecron_atomic_multi_file_commit

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~9,053Tokens (tool definitions)
~839 BTypical response size
Significant attention impact (7.07% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "gluecron": {
      "url": "https://gluecron.com/mcp"
    }
  }
}

Remote endpoints

https://gluecron.com/mcpstreamable-http

What it can do

Tool inventory

Tools (63)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢gluecron_repo_search(query, limit, offset)

Search Gluecron repositories by keyword (name + description), case-insensitively. Returns public repos plus any private repos owned by the authenticated caller. Default 20 per page, max 50; `total` is the full match count and `nextOffset` pages through it.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Search keyword (1-100 chars)"
    },
    "limit": {
      "type": "number",
      "description": "Max rows per page (default 20, max 50)"
    },
    "offset": {
      "type": "number",
      "description": "Rows to skip. Use `nextOffset` from the previous response."
    }
  },
  "required": [
    "query"
  ]
}
🟢gluecron_repo_read_file(owner, repo, ref, path)

Read a single file from a repository at a given ref (branch / tag / commit). Private repos are readable when the authenticated caller has access. Returns the text content (binary files rejected).

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "ref": {
      "type": "string",
      "description": "Branch / tag / commit. Defaults to the repository's actual default branch (which may not be 'main' — e.g. 'Main')."
    },
    "path": {
      "type": "string",
      "description": "File path within the repo"
    }
  },
  "required": [
    "owner",
    "repo",
    "path"
  ]
}
🟢gluecron_repo_list_issues(owner, repo, limit, offset)

List open issues for a public repository. Returns up to 50 ordered by most-recent.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "limit": {
      "type": "number",
      "description": "Max rows per page (default 25, max 50)"
    },
    "offset": {
      "type": "number",
      "description": "Rows to skip, for paging. Use `nextOffset` from the previous response."
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🟢gluecron_repo_explain_codebase(owner, repo)

Return the cached AI 'explain this codebase' Markdown for a public repo (most recent commit). Returns null when no cached explanation exists yet.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🟢gluecron_repo_health(owner, repo)

Compute the current health report for a public repo: overall score (0-100), letter grade, per-category breakdown (security/testing/complexity/dependencies/documentation/activity), and a list of insights to fix next. Backed by computeHealthScore in src/lib/intelligence.ts.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🟡gluecron_create_issue(owner, repo, title, body)

Create a new issue on a Gluecron repository. Requires authenticated caller with write access on the target repo. Returns {number, url}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "title": {
      "type": "string",
      "description": "Issue title"
    },
    "body": {
      "type": "string",
      "description": "Issue body (Markdown). Optional."
    }
  },
  "required": [
    "owner",
    "repo",
    "title"
  ]
}
🟡gluecron_comment_issue(owner, repo, number, body)

Add a comment to an existing issue. Requires authenticated caller with write access. Returns {commentId}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "number": {
      "type": "number",
      "description": "Issue number"
    },
    "body": {
      "type": "string",
      "description": "Comment body (Markdown)"
    }
  },
  "required": [
    "owner",
    "repo",
    "number",
    "body"
  ]
}
🔴gluecron_close_issue(owner, repo, number)

Close an open issue. Requires authenticated caller with write access. Idempotent — closing an already-closed issue is a no-op. Returns {state}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "number": {
      "type": "number",
      "description": "Issue number"
    }
  },
  "required": [
    "owner",
    "repo",
    "number"
  ]
}
🟡gluecron_reopen_issue(owner, repo, number)

Reopen a previously closed issue. Requires authenticated caller with write access. Idempotent. Returns {state}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "number": {
      "type": "number",
      "description": "Issue number"
    }
  },
  "required": [
    "owner",
    "repo",
    "number"
  ]
}
🟡gluecron_create_pr(owner, repo, title, body, head_branch, ...)

Open a new pull request. `head_branch` is required; `base_branch` defaults to the repo default branch. Requires authenticated caller with write access. Returns {number, url}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "title": {
      "type": "string",
      "description": "PR title"
    },
    "body": {
      "type": "string",
      "description": "PR body (Markdown). Optional."
    },
    "head_branch": {
      "type": "string",
      "description": "Branch with the changes"
    },
    "base_branch": {
      "type": "string",
      "description": "Target branch (default: repo default branch)"
    }
  },
  "required": [
    "owner",
    "repo",
    "title",
    "head_branch"
  ]
}
🟢gluecron_get_pr(owner, repo, number)

Fetch the full detail record of a pull request (title, body, state, branches, draft, author, timestamps). Authenticated callers only (the read tool surface still works anonymously).

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "number": {
      "type": "number",
      "description": "PR number"
    }
  },
  "required": [
    "owner",
    "repo",
    "number"
  ]
}
🟢gluecron_list_prs(owner, repo, state, limit, offset)

List pull requests on a repo, filtered by state (open|closed|merged|all). Authenticated callers only. Returns up to 50 summary rows.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "state": {
      "type": "string",
      "description": "open | closed | merged | all (default: open)"
    },
    "limit": {
      "type": "number",
      "description": "Max rows per page (default 50, max 100)"
    },
    "offset": {
      "type": "number",
      "description": "Rows to skip, for paging. Use `nextOffset` from the previous response."
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🟡gluecron_comment_pr(owner, repo, number, body)

Add a comment to a pull request. Requires authenticated caller with write access. Returns {commentId}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "number": {
      "type": "number",
      "description": "PR number"
    },
    "body": {
      "type": "string",
      "description": "Comment body (Markdown)"
    }
  },
  "required": [
    "owner",
    "repo",
    "number",
    "body"
  ]
}
🔴gluecron_merge_pr(owner, repo, number, confirm_high_risk)

Merge an open PR. Enforces the same checks as the HTTP merge flow: not a draft, head SHA resolves, GateTest+AI-review hard gates pass, branch-protection rules satisfied. M3: soft-blocks when the pre-merge risk score is `critical` unless `confirm_high_risk: true` is passed. Returns {merged, sha?, reason?, riskScore?}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "number": {
      "type": "number",
      "description": "PR number"
    },
    "confirm_high_risk": {
      "type": "boolean",
      "description": "When true, bypass the M3 risk-score soft-block on critical-band PRs."
    }
  },
  "required": [
    "owner",
    "repo",
    "number"
  ]
}
🔴gluecron_close_pr(owner, repo, number)

Close an open pull request without merging. Requires authenticated caller with write access. Idempotent. Returns {state}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner — username or organisation slug"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "number": {
      "type": "number",
      "description": "PR number"
    }
  },
  "required": [
    "owner",
    "repo",
    "number"
  ]
}
🟡gluecron_fork_repo(owner, repo)

Fork a repository to the authenticated caller's namespace. Mirrors POST /:owner/:repo/fork. Returns {owner, repo, url}. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Source repo owner"
    },
    "repo": {
      "type": "string",
      "description": "Source repo name"
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🔴gluecron_delete_repo(owner, repo)

Permanently delete a repository row (git data on disk is left untouched). Requires 'admin' access on the repo (owner, org owners/admins, admin collaborators) AND 'admin' token scope. Returns {deleted: true}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner username"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🔴gluecron_update_repo(owner, repo, description, is_private, default_branch, ...)

Update repository description / visibility / default_branch. Requires 'admin' access on the repo (owner, org owners/admins, admin collaborators) and 'repo' scope. Returns {ok: true}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner username"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "description": {
      "type": "string",
      "description": "New description (optional)"
    },
    "is_private": {
      "type": "boolean",
      "description": "Set visibility (optional)"
    },
    "default_branch": {
      "type": "string",
      "description": "Set default branch (optional)"
    },
    "automation": {
      "type": "object",
      "description": "Per-repo automation dials, same keys as Settings → Automation: ai_review_mode, pr_triage_mode, issue_triage_mode, auto_merge_mode, ci_autofix_mode, auto_repair_mode, auto_issues_mode, doc_drift_mode. Values: off | suggest | auto. Only the keys given change."
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🟢gluecron_search_repos(query, sort, limit, offset)

Search repositories by owner, name, owner/name or description, case-insensitively: every public repo, plus the private ones you own or collaborate on when authenticated. Omit `query` (authenticated) to list YOUR repositories — the ones you own or were invited to — instead of searching. Mirrors GET /api/v2/search/repos. `total` is the full match count (not the page size) and `nextOffset` pages through it.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Search keyword — matches owner login, repo name, owner/name and description. Omit to list your own repositories."
    },
    "sort": {
      "type": "string",
      "description": "stars | updated | name (default: stars)"
    },
    "limit": {
      "type": "number",
      "description": "Max rows per page (default 30, max 100)"
    },
    "offset": {
      "type": "number",
      "description": "Rows to skip. Use `nextOffset` from the previous response."
    }
  }
}
🟢gluecron_whoami

Who this connector is on this Gluecron instance: the signed-in username and email, whether that account is a site admin, the token's scopes, and how many repositories it owns or collaborates on. Call it first when a repository seems missing — the answer is usually which account authorized the connector. Anonymous callers get authenticated:false and a hint.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢gluecron_clone_url(owner, repo)

Return the authenticated HTTPS clone URL for a repo + a credential-helper hint. Use this instead of embedding tokens in URLs. Returns {url, owner, repo, defaultBranch, hint} using the repo's stored casing.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner username"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
⚪gluecron_label_issue(owner, repo, number, labels)

Attach one or more labels to an issue. Labels are created if they don't yet exist on the repo. Requires 'repo' scope. Returns {labels}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "number": {
      "type": "number"
    },
    "labels": {
      "type": "array",
      "description": "Label names (strings)"
    }
  },
  "required": [
    "owner",
    "repo",
    "number",
    "labels"
  ]
}
⚪gluecron_unlabel_issue(owner, repo, number, label)

Detach a label from an issue. Idempotent. Requires 'repo' scope. Returns {removed: boolean}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "number": {
      "type": "number"
    },
    "label": {
      "type": "string"
    }
  },
  "required": [
    "owner",
    "repo",
    "number",
    "label"
  ]
}
⚪gluecron_assign_issue(owner, repo, number, assignee)

Assign an issue to a user. Gluecron does not yet have a dedicated assignee table; assignment is modelled as an `assignee:<username>` label so it integrates with existing label tooling. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "number": {
      "type": "number"
    },
    "assignee": {
      "type": "string",
      "description": "Username to assign"
    }
  },
  "required": [
    "owner",
    "repo",
    "number",
    "assignee"
  ]
}
🟢gluecron_search_issues(owner, repo, query, state, limit)

Search issues by title/body keyword on a single repo, filtered by state. Returns ranked rows.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "query": {
      "type": "string",
      "description": "Search keyword"
    },
    "state": {
      "type": "string",
      "description": "open | closed | all (default open)"
    },
    "limit": {
      "type": "number"
    }
  },
  "required": [
    "owner",
    "repo",
    "query"
  ]
}
🟡gluecron_request_changes(owner, repo, number, body)

Post a 'changes requested' AI-review comment on a PR. The comment is tagged with isAiReview=true so the gate-checker recognises it. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "number": {
      "type": "number"
    },
    "body": {
      "type": "string",
      "description": "Review body (Markdown)"
    }
  },
  "required": [
    "owner",
    "repo",
    "number",
    "body"
  ]
}
🟢gluecron_search_prs(owner, repo, query, state, limit)

Search pull requests by title/body keyword on a repo.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "query": {
      "type": "string"
    },
    "state": {
      "type": "string",
      "description": "open|closed|merged|all (default open)"
    },
    "limit": {
      "type": "number"
    }
  },
  "required": [
    "owner",
    "repo",
    "query"
  ]
}
🟡gluecron_open_draft_pr(owner, repo, title, body, head_branch, ...)

Open a draft pull request. Same payload as gluecron_create_pr but forces is_draft=true. Useful for AI-in-progress PRs that shouldn't run mergeability checks yet.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "body": {
      "type": "string"
    },
    "head_branch": {
      "type": "string"
    },
    "base_branch": {
      "type": "string"
    }
  },
  "required": [
    "owner",
    "repo",
    "title",
    "head_branch"
  ]
}
🟢gluecron_generate_pr_description(diff, style)

Generate an AI commit-message-style description for a diff. Uses src/lib/ai-commit-message.ts under the hood; gracefully degrades to a heuristic when ANTHROPIC_API_KEY is missing. Returns {subject, body}.

Input Schema

{
  "type": "object",
  "properties": {
    "diff": {
      "type": "string",
      "description": "Unified-diff body"
    },
    "style": {
      "type": "string",
      "description": "'conventional' (default) or 'plain'"
    }
  },
  "required": [
    "diff"
  ]
}
🟢gluecron_read_file(owner, repo, ref, path, encoding)

Read a file from a repo at a given ref. Mirrors GET /api/v2/repos/:owner/:repo/contents/:path. Returns {path, size, content, encoding}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "ref": {
      "type": "string",
      "description": "Branch / tag / sha (default HEAD)"
    },
    "path": {
      "type": "string"
    },
    "encoding": {
      "type": "string",
      "description": "'utf8' (default) or 'base64'"
    }
  },
  "required": [
    "owner",
    "repo",
    "path"
  ]
}
🟡gluecron_write_file(owner, repo, path, branch, message, ...)

Create or update a file on a branch via git plumbing. Wraps `createOrUpdateFileOnBranch`. Pass `content` as a UTF-8 string OR `content_base64` for binary. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "path": {
      "type": "string"
    },
    "branch": {
      "type": "string"
    },
    "message": {
      "type": "string",
      "description": "Commit message"
    },
    "content": {
      "type": "string",
      "description": "UTF-8 file body (optional)"
    },
    "content_base64": {
      "type": "string",
      "description": "Base64 file body (optional)"
    },
    "expect_blob_sha": {
      "type": "string",
      "description": "Optimistic-concurrency check: existing blob sha must match."
    }
  },
  "required": [
    "owner",
    "repo",
    "path",
    "branch",
    "message"
  ]
}
🔴gluecron_delete_file(owner, repo, path, branch, message, ...)

Delete a file from a branch via git plumbing. Requires the existing blob sha (optimistic concurrency) and 'repo' scope. Mirrors DELETE /api/v2/contents.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "path": {
      "type": "string"
    },
    "branch": {
      "type": "string"
    },
    "message": {
      "type": "string"
    },
    "sha": {
      "type": "string",
      "description": "Current blob sha (40-hex)"
    }
  },
  "required": [
    "owner",
    "repo",
    "path",
    "branch",
    "message",
    "sha"
  ]
}
🟢gluecron_list_tree(owner, repo, ref, path, recursive)

List directory contents at a ref. `path` scopes the listing to a subtree and is honoured in BOTH modes; `recursive: true` walks the whole subtree instead of one level. Always returns the same shape: {path, ref, recursive, entries, truncated, totalCount}. Recursive entries carry full repo-relative paths; non-recursive entries carry names. A ref that does not exist is an error, never an empty listing.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "ref": {
      "type": "string",
      "description": "Branch / tag / sha. Omit (or pass HEAD) for the default branch."
    },
    "path": {
      "type": "string",
      "description": "Sub-path within the repo"
    },
    "recursive": {
      "type": "boolean"
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🟢gluecron_get_commit(owner, repo, sha, include_files)

Fetch a single commit by SHA: metadata plus the list of files it changed (path, status, additions, deletions). Mirrors GET /api/v2/repos/.../commits/:sha. Patch bodies are NOT included — use gluecron_get_diff for those.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "sha": {
      "type": "string",
      "description": "Commit SHA"
    },
    "include_files": {
      "type": "boolean",
      "description": "Include the files-changed summary and stats (default true). Set false to skip the diff read on very large commits."
    }
  },
  "required": [
    "owner",
    "repo",
    "sha"
  ]
}
🟢gluecron_get_diff(owner, repo, sha, base, head, ...)

Read the actual changes in a commit or a branch range. Pass `sha` for one commit against its first parent, or `base`+`head` for everything head adds since the merge base (what a PR proposes). Returns {files:[{path, oldPath?, status, additions, deletions, binary, patch, patchTruncated}], stats, truncated}. Patch text is byte-capped; set include_patch=false for a files-changed summary only.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "sha": {
      "type": "string",
      "description": "Commit SHA — diffs it against its first parent"
    },
    "base": {
      "type": "string",
      "description": "Base ref (with `head`)"
    },
    "head": {
      "type": "string",
      "description": "Head ref (with `base`)"
    },
    "include_patch": {
      "type": "boolean",
      "description": "Include patch bodies (default true)"
    },
    "max_patch_bytes": {
      "type": "number",
      "description": "Total budget for patch text across all files (default 400000, max 2000000)"
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🟡gluecron_create_branch(owner, repo, branch, sha)

Create a new branch ref pointing at an existing sha. Mirrors POST /api/v2/repos/.../git/refs. Requires 'repo' scope. Returns {ref, sha}.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "branch": {
      "type": "string",
      "description": "New branch name (short form)"
    },
    "sha": {
      "type": "string",
      "description": "Target commit sha (40-hex)"
    }
  },
  "required": [
    "owner",
    "repo",
    "branch",
    "sha"
  ]
}
🟡gluecron_atomic_multi_file_commit(owner, repo, branch, base_branch, message, ...)

Apply a set of file writes + deletes as a single atomic commit on a branch (creates the branch if it doesn't exist). The killer agent tool: blob/tree/commit/ref-update sequence. Each change is `{path, content?, content_base64?, deleted?}`. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "branch": {
      "type": "string"
    },
    "base_branch": {
      "type": "string",
      "description": "Branch to fork from when `branch` doesn't yet exist (default: repo default)."
    },
    "message": {
      "type": "string"
    },
    "changes": {
      "type": "array",
      "description": "Array of {path, content?|content_base64?, deleted?} entries."
    }
  },
  "required": [
    "owner",
    "repo",
    "branch",
    "message",
    "changes"
  ]
}
🔴gluecron_ship_spec(owner, repo, title, body)

Drop a spec file in .gluecron/specs/ with status: ready so the autopilot picks it up. Wraps voice-to-pr.shipAsSpec — handle both voice + manual specs. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "body": {
      "type": "string",
      "description": "Spec body (Markdown)"
    }
  },
  "required": [
    "owner",
    "repo",
    "title",
    "body"
  ]
}
🟡gluecron_voice_to_pr(owner, repo, transcript, as)

Interpret a free-form voice transcript and either ship it as a spec or create an issue (caller picks via `as`). Wraps src/lib/voice-to-pr.ts. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "transcript": {
      "type": "string"
    },
    "as": {
      "type": "string",
      "description": "'spec' or 'issue' (default: auto via interpretVoiceTranscript)"
    }
  },
  "required": [
    "owner",
    "repo",
    "transcript"
  ]
}
⚪gluecron_refactor_across_repos(description, repository_ids, dry_run)

Plan + execute a refactor that spans multiple repos owned by the caller. Wraps src/lib/multi-repo-refactor.ts. `dry_run: true` returns the plan only. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "description": {
      "type": "string",
      "description": "Natural-language description"
    },
    "repository_ids": {
      "type": "array",
      "description": "Optional explicit repo IDs to scope the refactor to."
    },
    "dry_run": {
      "type": "boolean",
      "description": "When true, returns the plan and does NOT execute."
    }
  },
  "required": [
    "description"
  ]
}
🟢gluecron_explain_repo(owner, repo)

Return the cached AI 'explain this codebase' Markdown for a repo. Pure read — never triggers a new generation (use the web UI for that).

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
⚪gluecron_chat_with_repo(owner, repo, message, title)

Start a new chat with a repo: creates a chat row, sends the first user message, streams + persists the assistant reply. Returns {chat_id, reply}. If the AI service does not answer this fails with a JSON-RPC error carrying {chat_id, ai_error} — it never returns apology copy as a reply. Requires authentication.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "message": {
      "type": "string",
      "description": "Initial user message"
    },
    "title": {
      "type": "string",
      "description": "Chat title (optional)"
    }
  },
  "required": [
    "owner",
    "repo",
    "message"
  ]
}
🟡gluecron_chat_continue(chat_id, message)

Send another message to an existing repo chat. Returns the assistant's reply. If the AI service does not answer this fails with a JSON-RPC error carrying {chat_id, ai_error} rather than returning apology copy as a reply.

Input Schema

{
  "type": "object",
  "properties": {
    "chat_id": {
      "type": "string"
    },
    "message": {
      "type": "string"
    }
  },
  "required": [
    "chat_id",
    "message"
  ]
}
⚪gluecron_generate_tests(owner, repo, number, mode)

Generate tests for a PR via Claude. Wraps src/lib/ai-test-generator.generateTestsForPr. Mode 'follow-up-pr' opens a new PR; 'append-commit' commits onto the head branch. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "number": {
      "type": "number",
      "description": "PR number"
    },
    "mode": {
      "type": "string",
      "description": "'follow-up-pr' or 'append-commit'"
    }
  },
  "required": [
    "owner",
    "repo",
    "number"
  ]
}
🟢gluecron_generate_commit_message(diff, style)

Generate a commit message for a diff. Same engine as gluecron_generate_pr_description but explicit for the commit-message use case.

Input Schema

{
  "type": "object",
  "properties": {
    "diff": {
      "type": "string"
    },
    "style": {
      "type": "string",
      "description": "'conventional' (default) or 'plain'"
    }
  },
  "required": [
    "diff"
  ]
}
🟢gluecron_generate_release_notes(owner, repo, from_tag, to_tag)

Generate release notes between two tags. Wraps src/lib/ai-release-notes.generateReleaseNotes. Returns the rendered Markdown + section data.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "from_tag": {
      "type": "string",
      "description": "Previous tag (optional)"
    },
    "to_tag": {
      "type": "string",
      "description": "New tag"
    }
  },
  "required": [
    "owner",
    "repo",
    "to_tag"
  ]
}
⚪gluecron_propose_migration(owner, repo, dependency, from_version, to_version, ...)

Propose a dependency-upgrade PR. Wraps src/lib/migration-assistant.proposeMajorMigration. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "dependency": {
      "type": "string"
    },
    "from_version": {
      "type": "string"
    },
    "to_version": {
      "type": "string"
    },
    "base_sha": {
      "type": "string",
      "description": "Commit sha to fork from"
    },
    "changelog": {
      "type": "string",
      "description": "Optional changelog text"
    }
  },
  "required": [
    "owner",
    "repo",
    "dependency",
    "from_version",
    "to_version",
    "base_sha"
  ]
}
🟡gluecron_propose_doc_update(owner, repo)

Manual trigger for the AI doc-update flow: scans tracked sections on the default branch and opens a PR rewriting stale prose. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}
🟡gluecron_trigger_workflow(owner, repo, filename, ref, inputs)

Dispatch a workflow_dispatch run. Mirrors POST /api/v2/repos/.../actions/workflows/:filename/dispatches. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "filename": {
      "type": "string",
      "description": "Workflow filename (e.g. ci.yml)"
    },
    "ref": {
      "type": "string",
      "description": "Branch / tag / sha (default: repo default branch)"
    },
    "inputs": {
      "type": "object",
      "description": "Workflow inputs (object)"
    }
  },
  "required": [
    "owner",
    "repo",
    "filename"
  ]
}
🟢gluecron_get_workflow_run(owner, repo, run_id)

Fetch a workflow run's metadata + status. Mirrors GET /api/v2/repos/.../actions/runs/:id.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "run_id": {
      "type": "string"
    }
  },
  "required": [
    "owner",
    "repo",
    "run_id"
  ]
}
🟢gluecron_get_workflow_logs(owner, repo, run_id)

Return concatenated per-job logs for a workflow run, plus per-job metadata. JSON-friendly companion to the ZIP-download endpoint.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "run_id": {
      "type": "string"
    }
  },
  "required": [
    "owner",
    "repo",
    "run_id"
  ]
}
🔴gluecron_cancel_workflow_run(owner, repo, run_id)

Cancel a queued/running workflow run. Requires 'repo' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "run_id": {
      "type": "string"
    }
  },
  "required": [
    "owner",
    "repo",
    "run_id"
  ]
}
🟢gluecron_get_preview_url(owner, repo, branch)

Return the branch-preview URL + status for a (repo, branch) pair. Wraps branch-previews.getPreviewForBranch. Returns {ok:false, reason:'not enabled on this host'} when the host has no PREVIEW_DOMAIN (no preview would ever resolve).

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "branch": {
      "type": "string"
    }
  },
  "required": [
    "owner",
    "repo",
    "branch"
  ]
}
⚪gluecron_provision_pr_sandbox(owner, repo, number)

Provision (or re-provision) a sandbox for a PR. Wraps pr-sandbox.provisionSandbox. Requires 'repo' scope. Returns {ok:false, reason:'not enabled on this host'} when no sandbox provisioner runs on the host.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "number": {
      "type": "number"
    }
  },
  "required": [
    "owner",
    "repo",
    "number"
  ]
}
🟡gluecron_create_agent_session(name, repository_id, branch_namespace, budget_cents_per_day)

Mint a new agent-multiplayer session. Returns the plaintext `token` exactly once (store it). Requires 'admin' scope.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Human-readable session name (unique per owner)"
    },
    "repository_id": {
      "type": "string",
      "description": "Optional repo to scope to"
    },
    "branch_namespace": {
      "type": "string",
      "description": "Optional branch namespace override"
    },
    "budget_cents_per_day": {
      "type": "number",
      "description": "Daily budget cap in cents (default 500)"
    }
  },
  "required": [
    "name"
  ]
}
⚪gluecron_acquire_lease(agent_session_id, target_type, target_id, duration_ms)

Grab an exclusive lease on a target (e.g. a PR or branch) for an agent session. Returns null when another agent holds an active lease.

Input Schema

{
  "type": "object",
  "properties": {
    "agent_session_id": {
      "type": "string"
    },
    "target_type": {
      "type": "string",
      "description": "e.g. 'pull_request', 'branch'"
    },
    "target_id": {
      "type": "string"
    },
    "duration_ms": {
      "type": "number",
      "description": "Lease duration (default 5 minutes)"
    }
  },
  "required": [
    "agent_session_id",
    "target_type",
    "target_id"
  ]
}
⚪gluecron_release_lease(lease_id)

Release a lease by id. Idempotent. Returns {released}.

Input Schema

{
  "type": "object",
  "properties": {
    "lease_id": {
      "type": "string"
    }
  },
  "required": [
    "lease_id"
  ]
}
🟢gluecron_get_agent_budget(agent_session_id)

Return spent / cap / remaining cents for an agent session.

Input Schema

{
  "type": "object",
  "properties": {
    "agent_session_id": {
      "type": "string"
    }
  },
  "required": [
    "agent_session_id"
  ]
}
🟢gluecron_semantic_search(owner, repo, query, limit)

Query the per-repo vector index (Voyage embeddings when configured, hash fallback otherwise). Reads the live per-push index (code_embeddings) first, falling back to the manually-reindexed chunk index (code_chunks). Returns {hits, source, indexed, indexedFiles} — `indexed: false` means the repo has never been indexed (empty hits are NOT 'no match'); `indexedFiles` is the live-index row count.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "query": {
      "type": "string"
    },
    "limit": {
      "type": "number"
    }
  },
  "required": [
    "owner",
    "repo",
    "query"
  ]
}
🟢gluecron_find_symbol(owner, repo, name)

Find definitions of a symbol by name within a repo. Wraps src/lib/symbols.findDefinitions.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "name": {
      "type": "string",
      "description": "Symbol name"
    }
  },
  "required": [
    "owner",
    "repo",
    "name"
  ]
}
🟢gluecron_pr_status_summary(owner, repo, number)

Compute a one-shot status summary for a PR: state, risk score (and whether it describes the current head), CI state for the head commit as the merge gate sees it, AI-review verdicts (trio), gate signals. Read-only.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "number": {
      "type": "number"
    }
  },
  "required": [
    "owner",
    "repo",
    "number"
  ]
}
🟢gluecron_ai_cost_summary(scope, owner, repo, agent_session_id)

Return AI spend rollups. Scope by one of: user_id (self), repo {owner,repo}, or agent_session_id. Defaults to caller's user spend.

Input Schema

{
  "type": "object",
  "properties": {
    "scope": {
      "type": "string",
      "description": "'user' (default) | 'repo' | 'agent'"
    },
    "owner": {
      "type": "string"
    },
    "repo": {
      "type": "string"
    },
    "agent_session_id": {
      "type": "string"
    }
  }
}
🟢gluecron_security_scan(owner, repo, ref, include_ai_review, max_candidate_lines)

Everything Gluecron actually knows about a repository's security, in one honest call: OSV.dev CVE/GHSA advisories against the indexed dependency graph (with FIXED VERSIONS), Gluecron's supplemental advisory list, a full-tree committed-secret scan, and optionally a Claude semantic code review. Unlike gluecron_repo_health, an empty result is NEVER reported as a pass: every category returns status 'assessed' | 'partial' | 'not_assessed' | 'error' with a machine-readable reason code, so you can tell 'we checked and it is clean' from 'we never looked'. In particular, a repo whose dependency graph was never indexed returns dependency_advisories.status='not_assessed' (reason 'dependency_graph_not_indexed'), not an empty advisory list. Read-only.

Input Schema

{
  "type": "object",
  "properties": {
    "owner": {
      "type": "string",
      "description": "Repo owner username"
    },
    "repo": {
      "type": "string",
      "description": "Repo name"
    },
    "ref": {
      "type": "string",
      "description": "Branch, tag or commit SHA to scan the tree of. Default: the repo's default branch. Note advisories describe the INDEXED dependency graph, whose commit is reported separately — if it differs from this ref the advisory answer is downgraded to 'partial'."
    },
    "include_ai_review": {
      "type": "boolean",
      "description": "Opt in to the Claude Sonnet semantic review (SQLi/XSS/SSRF/authz/crypto). Costs an Anthropic call and adds seconds. Default false. When it cannot run — no key, provider error, unparseable output — the category reports 'not_assessed', never a pass."
    },
    "max_candidate_lines": {
      "type": "number",
      "description": "Cap on lines the secret detector inspects (1-200000, default 20000). The whole tree is always prefiltered; only lines that already matched a secret marker are inspected, so this rarely binds. When it does, committed_secrets reports 'partial' with the exact fraction."
    }
  },
  "required": [
    "owner",
    "repo"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded63 tools
verifiedversion not recorded62 tools