MCP Server
GitBlixt is a Model Context Protocol (MCP) server. AI agents such as Claude Code connect to it and get tools for your repositories, merge requests, pipelines, deployed apps and AI jobs, so you can ask things like "why is production returning 500s?" and let the agent read the app's logs itself.
The endpoint is https://git.michlp.com/mcp
(Streamable HTTP, stateless). It offers one gitlab_api
tool that reaches the whole REST API, plus
native tools for GitBlixt features the REST API doesn't cover, such as app logs,
deploys, AI jobs, wiki pages and server administration.
Connecting a client
-
Create a
personal access token
with the
read_apiscope (read-only) or theapiscope (read and write). - Add the server to your client, passing the token as a Bearer token.
Claude Code
claude mcp add --transport http gitblixt https://git.michlp.com/mcp \
--header "Authorization: Bearer glpat-YOUR_TOKEN"
Add --scope user
to make it available in every project. Run claude mcp list, or /mcp
inside Claude Code, to confirm it connected and see its tools.
Other clients and shared config
Clients that read an mcpServers
JSON config, such as a project's .mcp.json, take:
{
"mcpServers": {
"gitblixt": {
"type": "http",
"url": "https://git.michlp.com/mcp",
"headers": { "Authorization": "Bearer ${GITBLIXT_TOKEN}" }
}
}
}
Claude Code expands ${GITBLIXT_TOKEN}
from your environment, so the token never has to be committed. The client must be able
to send a header: GitBlixt doesn't implement MCP's OAuth discovery, so clients that only
support OAuth sign-in can't connect.
Checking the connection with curl
curl -X POST https://git.michlp.com/mcp \
-H "Authorization: Bearer glpat-YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'
A valid token returns the tools it can use; a missing or invalid one returns 401.
Permissions
The token's scopes decide which tools a client sees. Tools the token can't use are left out of the list entirely, so the agent never tries them.
| Tools | Token needs |
|---|---|
| Read | read_api or api |
| Write | api |
| Admin | An admin account with the matching admin permission, plus the scope above |
Every tool also checks your role on the project it touches, exactly as the web UI does.
For example, reading app logs, deploying and seeing AI job logs need developer access.
The environment variable tools follow the REST API instead and need maintainer access,
though the environment's Variables page lets developers change variables.
Through gitlab_api, a read_api
token can only make GET
requests.
Example prompts
- "Show me the errors in the production logs of alice/shop since the last deploy."
- "The latest deploy of staging failed. Find out why and fix it."
- "Summarize the unresolved threads on merge request !42."
- "Pipeline #318 failed. Read the job logs and tell me what broke."
- "Redeploy production of alice/shop, then watch the logs for a minute."
- "Start an AI review of merge request !42 using my default model."
- "What's left on my Roadmap idea board? Close the ideas we shipped this week."
- "Create a staging environment for alice/shop with a managed database, copy POOL_SIZE from production and generate a SECRET_KEY_BASE."
Using Ideas from Claude
With the server connected, you can tell Claude about an idea and let it keep track of it on your idea boards. A typical exchange:
- You: "I want to add offline mode to the mobile app. Put it on my Roadmap board for next sprint, label it mobile, due the 30th, and break it into steps."
-
Claude
calls
list_idea_boardsto find Roadmap and its columns, thencreate_ideawithtitle"Offline mode",column_idof Next,labels: ["mobile"],due_dateand achecklistof steps, and answers with the new idea's number and link. -
You, a week later:
"We shipped offline mode." Claude calls
search_ideas(orlist_ideas) to find it andtransition_ideawithaction: "complete", which files it in the done column.
Claude can also comment (add_idea_comment), move ideas between columns and
boards (move_idea), set reminders, convert an idea to an issue, or start an AI
agent on it (run_idea_ai): every Ideas tool is listed below.
Tool reference
Project-scoped tools take a project
argument: the numeric project ID or its full path, e.g. 42
or "alice/shop". Environments are named as on the project's Environments page.
GitLab API
gitlab_api
read
Call GitBlixt's GitLab-compatible REST API (GitLab API v4) as the current user. `path` is relative to /api/v4, e.g. "/projects/12/merge_requests" or "/projects/group%2Frepo/issues/3": a "namespace/repo" project id must be URL-encoded ("/" as %2F). Covers projects, repository tree/files/branches/commits/compare, merge requests (notes, discussions, changes, merge), issues, labels, milestones, releases, pipelines and jobs, CI variables, protected branches, webhooks and users. Returns the HTTP status and the decoded JSON body. List endpoints are paginated (20 per page, max 100): pass `page` and `per_page` in `query`, and read the `pagination` object in the result (page, per_page, total, total_pages, next_page, prev_page; next_page is null on the last page, and keys the endpoint does not report are omitted).
| Argument | Type | Notes |
|---|---|---|
method
*
|
string | One of: GET, POST, PUT, PATCH, DELETE |
path
*
|
string | Path under /api/v4, starting with "/", without a query string |
body
|
object | JSON request body |
query
|
object | Query string parameters |
Apps & environments
list_environments
read
List a project's PaaS deployment environments, including active MR previews: branch, status, domains/url, replicas and last deploy.
| Argument | Type | Notes |
|---|---|---|
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
get_environment
read
Show one PaaS environment of a project: branch, status, domains/url, replicas, last deploy, port, health check path, auto deploy, skip smoke test, build platform and whether it has a managed database. Environment variable values are never returned; the smoke test variables' values only to developers.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
create_environment
write
Create a PaaS environment in a project, like the New environment page. Settings left out default as on that page: the project's default branch, port 4000, 1 replica, health check path /health, auto deploy on. managed_db also creates its Postgres database right away, as provision_database does, and sets DATABASE_URL (never returned); if that fails, the environment is kept and the error says how to retry. requires_approval needs maintainer access. Nothing is deployed until deploy_environment, or a push to the branch with auto deploy on, so set the environment's variables first (set_env_var, which needs maintainer access; developers can use the environment's Variables page). Needs developer access and the feature:deploy_apps permission.
| Argument | Type | Notes |
|---|---|---|
name
*
|
string | Environment name, e.g. "staging": lowercase letters, digits and hyphens |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
auto_deploy
|
boolean | Deploy on every push to the branch |
branch
|
string | Branch to deploy; empty for the project's default branch |
build_platform
|
string | Docker platform to build for, e.g. "linux/amd64"; empty for the host's |
deploy_trigger
|
string | When auto deploy deploys a push: after_ci once its CI pipeline passes, or on_push straight away, running no CI on the branch. One of: after_ci, on_push |
domains
|
array of string | Domains the environment serves; SSL is automatic |
health_check_path
|
string | Path the smoke test and health checks request, e.g. "/up"; empty resets it to "/health" |
managed_db
|
boolean | Create a managed Postgres database for it and set DATABASE_URL. Default false |
port
|
integer | Range 1–65535 |
replicas
|
integer | Range 0–10 |
requires_approval
|
boolean | Require approval before every deploy. Needs maintainer access. Default false |
skip_smoke_test
|
boolean | Deploy without first checking the new image answers the health check |
smoke_test_env
|
object | Variables set over the environment's for the smoke test container only, e.g. {"OBAN_ENABLED": "false"}; replaces the current ones. Plain text, not for secrets |
get_app_logs
read
Read the runtime logs (container stdout/stderr) of a deployed PaaS environment, oldest to newest. Returns the most recent `limit` lines matching the filters. Requires developer access to the project.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
http_status
|
string | Only lines containing an HTTP status of this class. One of: 2xx, 3xx, 4xx, 5xx |
limit
|
integer | Range 1–1000. Default 200 |
query
|
string | Case-insensitive substring to match |
since
|
string | ISO 8601 timestamp; only lines at or after it |
source
|
string | One of: stdout, stderr, system |
until
|
string | ISO 8601 timestamp; only lines at or before it |
get_environment_metrics
read
Read a deployed PaaS environment's metrics over a time range, oldest first: CPU (cores in use) and memory (bytes) per container instance with the host's limits, and per bucket request counts by status class with the chosen latency percentile in seconds (10.0 means 10 s or more). Request metrics exist only for environments with a domain; buckets without requests are left out. Includes successful deploys in the range. Requires developer access to the project.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
percentile
|
integer | One of: 50, 90, 95, 99. Default 90 |
range
|
string | One of: 1h, 6h, 24h, 2d, 7d, 14d. Default "24h" |
list_deployments
read
List recent deploys of a PaaS environment, newest first: status, commit sha, ref and timing. Failed deploys include the tail of the deploy log when you have developer access.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
limit
|
integer | Range 1–50. Default 10 |
deploy_environment
write
Deploy the latest commit of a PaaS environment's branch, like the Deploy button. The deploy runs asynchronously; follow it with list_deployments. Environments that require approval report status awaiting_approval until a reviewer approves.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
stop_environment
write
Stop a PaaS environment, like the Stop button: removes its running service. Deploy it again to bring it back.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
restart_environment
write
Restart a running PaaS environment's containers on the same image and environment variables. To pick up new code or changed variables, deploy instead.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
update_environment
write
Change a PaaS environment's settings: branch, domains, port, replicas, health check path, auto deploy, deploy trigger, skip smoke test, smoke test variables and build platform. Only the settings given change. The proxy picks up domain and port changes within 30 minutes, without a deploy, so deploy (deploy_environment) right after changing the port; the rest take effect on the next deploy.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
auto_deploy
|
boolean | Deploy on every push to the branch |
branch
|
string | Branch to deploy; empty for the project's default branch |
build_platform
|
string | Docker platform to build for, e.g. "linux/amd64"; empty for the host's |
deploy_trigger
|
string | When auto deploy deploys a push: after_ci once its CI pipeline passes, or on_push straight away, running no CI on the branch. One of: after_ci, on_push |
domains
|
array of string | Every domain the environment serves, replacing the current list |
health_check_path
|
string | Path the smoke test and health checks request, e.g. "/up"; empty resets it to "/health" |
port
|
integer | Range 1–65535 |
replicas
|
integer | Range 0–10 |
skip_smoke_test
|
boolean | Deploy without first checking the new image answers the health check |
smoke_test_env
|
object | Variables set over the environment's for the smoke test container only, e.g. {"OBAN_ENABLED": "false"}; replaces the current ones. Plain text, not for secrets |
provision_database
write
Create a managed database for a PaaS environment on GitBlixt's own Postgres (or MariaDB), like Create database on the environment's Database page: the environment gets DATABASE_URL, plus POOL_SIZE=5 for Postgres unless it sets one, or WORDPRESS_DB_HOST, _NAME, _USER and _PASSWORD for MariaDB. Refused when the environment already has a managed database, a DATABASE_URL or, for MariaDB, any of those WORDPRESS_DB_ variables. Also the retry when create_environment couldn't provision one. The URL is never returned; the app picks it up on its next deploy (deploy_environment).
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
engine
|
string | mariadb for WordPress and other MySQL apps. One of: postgres, mariadb. Default "postgres" |
Environment variables
list_env_vars
read
List the names of a PaaS environment's variables; values are never returned. keys are the environment's own variables; shared_keys are app-level variables every environment gets unless it sets the same key itself (left out for project-restricted (AI job) tokens). Needs maintainer access.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
set_env_var
write
Set one of a PaaS environment's own variables, creating it or replacing its value (replaced says which). Give exactly one of: value, a literal, which passes through your transcript; generate, random bytes encoded on the server, e.g. {"bytes": 64} for a Phoenix SECRET_KEY_BASE or {"bytes": 32} for a Cloak key; or copy_from, another environment's value copied on the server, e.g. {"environment": "production"}. The value is never returned. Regenerating a key that encrypts stored data makes that data unreadable. The running app keeps its old value until the next deploy (deploy_environment). Needs maintainer access.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
key
*
|
string | Variable name: uppercase letters, digits and underscores |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
copy_from
|
object | Copy another environment's own variable in this project, on the server: environment, plus key when its name differs from this one's |
generate
|
object | A random value made on the server: bytes (16 to 128) random bytes, encoded as base64 (standard, padded; the default), base64url (unpadded) or hex (lowercase) |
value
|
string | A literal value. It appears in your transcript, so not for secrets |
delete_env_var
write
Delete one of a PaaS environment's own variables (not an app-level shared one). The running app keeps it until the next deploy (deploy_environment). Needs maintainer access.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
key
*
|
string | Variable name, e.g. POOL_SIZE |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
App email
get_email_setup
read
Show a PaaS environment's email setup: provider, sending domain, From address, status (pending_dns, verifying, issuing, verified or failed), the last error, the DNS records to publish and, once verified, the env vars written. Needs developer access and the feature:manage_email permission. Secrets are never returned.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
set_up_email
write
Set up outbound email for a PaaS environment, replacing any earlier setup. Registers the sending domain with the provider and returns the DNS records to publish (publish_email_dns adds them to Cloudflare). Verification is then checked automatically for 72 hours; once verified, SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD and MAIL_FROM are written to the environment, which picks them up on its next deploy. mailgun and ses use your stored credential (save_email_credential); smtp takes host, port, username and password. Not available on preview environments.
| Argument | Type | Notes |
|---|---|---|
domain
*
|
string | Sending domain; a subdomain such as mail.example.com is recommended |
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
provider
*
|
string | One of: mailgun, ses, smtp |
dkim_records
|
array of object | smtp only: the provider's DKIM records as {type, name, value} objects, named under <domain>'s _domainkey |
from
|
string | MAIL_FROM address at the domain; defaults to noreply@<domain> |
host
|
string | smtp only |
password
|
string | smtp only |
port
|
integer | smtp only. Range 1–65535 |
spf_include
|
string | smtp only: the provider's SPF include host, e.g. spf.example.com |
username
|
string | smtp only |
check_email_setup
write
Ask the provider now whether an environment's sending domain is verified, instead of waiting for the automatic check. Once it is, the SMTP env vars are written; deploy the environment to pick them up.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
publish_email_dns
write
Add an environment's email DNS records (SPF, DKIM, DMARC) to the domain's Cloudflare zone with your stored Cloudflare credential (save_email_credential with an API token that can edit DNS, or connect Cloudflare in the web UI), then check verification. Returns each record's outcome.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
request_ses_production_access
write
For an Amazon SES email setup, ask AWS to move the account out of the SES sandbox (where mail only reaches verified addresses). AWS reviews the request manually. Only the person who set up the email may request it, as it acts on their AWS account.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
website_url
*
|
string | The app's public URL, shown to AWS in the request |
remove_email_setup
write
Delete a PaaS environment's email setup. The domain and sending credentials at the provider, the DNS records and the SMTP env vars already written are left in place.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
list_email_credentials
read
List your stored email setup credentials (mailgun, ses, cloudflare) with their region and last update. Secrets are never returned.
save_email_credential
write
Store your credential for an email setup provider, encrypted, replacing any earlier one. It is tested first, so a bad key never replaces a working one. mailgun: api_key and region (us or eu). ses: access_key_id, secret_access_key and region (e.g. us-east-1). cloudflare: api_token with DNS edit access.
| Argument | Type | Notes |
|---|---|---|
provider
*
|
string | One of: mailgun, ses, cloudflare |
access_key_id
|
string | ses |
api_key
|
string | mailgun |
api_token
|
string | cloudflare |
region
|
string | mailgun and ses |
secret_access_key
|
string | ses |
delete_email_credential
write
Delete your stored credential for an email setup provider. Pending mailgun or ses setups that use it fail at their next check; verified ones keep sending.
| Argument | Type | Notes |
|---|---|---|
provider
*
|
string | One of: mailgun, ses, cloudflare |
Databases
describe_database
read
Describe a PaaS environment's database (Postgres or MariaDB). Without table: its schemas with their tables and views. With table: its columns, indexes, foreign keys, row estimate and size. Read data with query_database. An admin must enable the DB editor for environments and grant you the db_admin:environments permission, and you need developer access to the project. Not available to project-restricted (AI job) tokens.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
schema
|
string | Schema (on MariaDB, the database) to describe. Default: every schema, or public (MariaDB: the connected database) when table is given |
table
|
string | Table to describe in detail |
query_database
read
Run one SQL statement against a PaaS environment's database (Postgres or MariaDB). Read-only by default: only SELECT, WITH, SHOW, EXPLAIN, DESCRIBE, VALUES and TABLE statements run, inside a READ ONLY transaction that is always rolled back, with a 30 second statement timeout; ones that write files, cancel or terminate backends, take session locks or call dblink_exec/lo_export are refused. Set allow_write to change data: that needs a token with the api scope, commits immediately, and runs only INSERT, REPLACE, MERGE, and UPDATE/DELETE with WHERE; use the browser DB editor for anything else. Rows are capped at limit (truncated is true when more exist). Binary values, Postgres uuids included, come back as \x-prefixed hex; cast them to text for readable output. Every query is recorded in the DB editor audit log. An admin must enable the DB editor for environments and grant you the db_admin:environments permission, and you need developer access to the project. Not available to project-restricted (AI job) tokens.
| Argument | Type | Notes |
|---|---|---|
environment
*
|
string | Environment name, e.g. "production" |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
sql
*
|
string | One SQL statement |
allow_write
|
boolean | Run outside the read-only transaction so INSERT/UPDATE/DELETE take effect. Needs the api scope.. Default false |
limit
|
integer | Most rows to return. Range 1–1000. Default 100 |
AI jobs
run_ai_job
write
Start an AI agent job on a project, like the "Fix with AI" / "Review with AI" buttons: fix_issue fixes an issue on a new branch and opens a merge request (needs issue_iid); review_mr reviews a merge request at the chosen review_depth and posts the review as notes, fix_mr applies its review feedback as new commits, resolve_conflicts merges the target branch into a conflicting merge request and resolves the conflicts, landing the merge on its source branch or a draft follow-up merge request (all three need merge_request_iid); freeform runs an open-ended prompt on a new branch off `branch` (default: the project's default branch) and opens a merge request into that branch only if the agent changed code — otherwise its answer is the job's result_summary. provider, model and effort default to your last-used selection. Runs asynchronously; follow it with get_ai_job. Requires developer access.
| Argument | Type | Notes |
|---|---|---|
job_type
*
|
string | One of: fix_issue, review_mr, fix_mr, resolve_conflicts, freeform |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
background
|
boolean | Fix and resolve_conflicts jobs only: run in the background (default) or show live. Default true |
branch
|
string | Existing branch to work from and open the merge request into (freeform; defaults to the project's default branch) |
dry_run
|
boolean | review_mr only: runs the review and stores it on the job without posting anything to the merge request, for benchmarking. Cannot be combined with auto-merge. Default false |
effort
|
string | One of: low, medium, high, xhigh, max |
issue_iid
|
integer | Issue to fix (fix_issue) |
merge_request_iid
|
integer | Merge request to review, fix or resolve (review_mr, fix_mr, resolve_conflicts) |
model
|
string | Model id; required except for Anthropic |
prompt
|
string | What the agent should do (freeform, required) |
provider
|
string | Slug of one of your AI provider keys, e.g. "anthropic" |
review_depth
|
string | review_mr only; defaults to your AI settings. quick: One agent reviews the diff with a secrets scan and semgrep, without compiling or running tests; about 5 to 10 minutes. moderate: Parallel subagents review the diff after compiling and running the project's static analysis; about 20 to 45 minutes. thorough: Everything in Moderate, plus the tests that cover the change, run against a provisioned test database; about 40 to 75 minutes.. One of: quick, moderate, thorough |
list_ai_jobs
read
List a project's AI agent jobs, newest first: type, status, provider/model, result summary and timing. Requires developer access.
| Argument | Type | Notes |
|---|---|---|
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
limit
|
integer | Range 1–50. Default 20 |
status
|
string | One of: pending, running, success, failed, canceled |
get_ai_job
read
Show an AI agent job: status, type, provider/model, timing, result summary, exit code, the branch and merge request it worked on or created, and the last lines of its log. Requires developer access.
| Argument | Type | Notes |
|---|---|---|
id
*
|
integer | |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
log_tail_lines
|
integer | Range 0–2000. Default 200 |
get_ai_job_log
read
Read an AI agent job's full log in pages of lines, oldest first, optionally filtered by a case-insensitive substring. get_ai_job only returns the tail; use this for the hunt phase of a review or anything earlier in a run. Requires developer access.
| Argument | Type | Notes |
|---|---|---|
id
*
|
integer | |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
limit
|
integer | Maximum number of lines to return. Range 1–2000. Default 500 |
offset
|
integer | Index of the first line to return; counts only matching lines when query is given. Range 0–. Default 0 |
query
|
string | Case-insensitive substring to match |
cancel_ai_job
write
Cancel a pending or running AI agent job, stopping its container. Allowed for the job's creator and developers of the project.
| Argument | Type | Notes |
|---|---|---|
id
*
|
integer | |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
Wiki & snippets
list_wiki_pages
read
List a project's wiki pages (title and slug). Read one with get_wiki_page.
| Argument | Type | Notes |
|---|---|---|
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
get_wiki_page
read
Read a project wiki page's Markdown content by its slug.
| Argument | Type | Notes |
|---|---|---|
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
slug
*
|
string | Page slug, e.g. "getting-started" |
write_wiki_page
write
Create or update a project wiki page. Updates the page at `slug` when it exists, otherwise creates it; `slug` defaults to one derived from the title. Content is Markdown. Requires developer access.
| Argument | Type | Notes |
|---|---|---|
content
*
|
string | Markdown; replaces the page body |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
title
*
|
string | |
slug
|
string | Lowercase letters, numbers, - and _; pass it to update a page |
list_snippets
read
List code snippets: your own (any visibility) and everyone's public ones, newest first, without content. Read one with get_snippet.
| Argument | Type | Notes |
|---|---|---|
limit
|
integer | Range 1–100. Default 50 |
get_snippet
read
Read a code snippet with its content: public, internal (any signed-in user) or your own.
| Argument | Type | Notes |
|---|---|---|
id
*
|
integer |
write_snippet
write
Create a code snippet, or update one of your own by passing its id. Visibility: private (default, only you), internal (signed-in users) or public.
| Argument | Type | Notes |
|---|---|---|
content
*
|
string | |
title
*
|
string | |
description
|
string | |
file_name
|
string | Used for syntax highlighting, e.g. "notes.md" |
id
|
integer | Snippet to update; omit to create |
visibility
|
string | One of: public, internal, private |
Releases
list_releases
read
List a project's releases (GitLab release JSON, newest first), or pass tag_name for one release or latest: true for the newest one already released (the releases/permalink/latest release). Each asset link carries a direct_asset_url, the stable download address to hand out. Files for asset links can be uploaded through the generic package API (PUT /api/v4/projects/:id/packages/generic/<name>/<version>/<file>), which gitlab_api cannot carry. Change releases with manage_release.
| Argument | Type | Notes |
|---|---|---|
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
latest
|
boolean | Return only the newest release already released |
tag_name
|
string | Return only this tag's release |
manage_release
write
Create, update or delete a project's release (identified by tag_name), or add, update or delete one of its asset links. Actions: create (name, description, released_at, ref, links), update (name, description, released_at), delete, add_link (name and url; optional direct_asset_path and link_type), update_link (link_id plus fields), delete_link (link_id). For link actions name is the link's name. A link's direct_asset_path gives it a permanent direct_asset_url under the release. Returns the release (see list_releases).
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: create, update, delete, add_link, update_link, delete_link |
project
*
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
tag_name
*
|
string | The release's tag |
description
|
string | Release notes (Markdown) |
direct_asset_path
|
string | Stable path for the link's direct asset URL, e.g. "/bin/app.tar.gz" |
link_id
|
integer | Link to update or delete |
link_type
|
string | Defaults to other. One of: other, runbook, image, package |
links
|
array of object | Asset links to create the release with |
name
|
string | Release title, or the link's name |
ref
|
string | create only: branch, tag or commit to tag as tag_name when that tag doesn't exist yet |
released_at
|
string | ISO 8601 time; a future one makes an upcoming release |
url
|
string | http(s) URL of the link |
Ideas
list_idea_boards
read
List your idea boards (Trello-style boards of ideas and tasks, separate from project issues): your personal boards, including your Inbox, plus boards shared with you directly or through an organization. Each board has your role on it (viewer, editor or admin) and its open columns with how many ideas each holds. Use a board's id with get_idea_board (columns, labels, members, custom fields), list_ideas, get_idea, create_idea and update_idea.
| Argument | Type | Notes |
|---|---|---|
archived
|
boolean | List archived boards instead. Default false |
get_idea_board
read
Read an idea board with what you need to work on it: its settings and your role, columns (ids, done flag, WIP limit, archived), the labels its ideas can use (the board's and its workspace's), members, custom fields with their dropdown options, automations (rules, buttons and schedules; only the enabled buttons unless you can edit it) and export URLs. Board admins also get how many webhooks and Slack subscriptions it has (get_idea_board_integrations lists them). Its email address and your private calendar feed URLs come from manage_idea_board_integrations action get.
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
get_idea_board_integrations
read
Read an idea board's connections to the outside (board admins only): its webhooks and Slack subscriptions. manage_idea_board_integrations changes them, and its action get also gives the board's email address.
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
manage_idea_board
write
Create or change an idea board. create makes a board with the default columns (Ideas, Next, Doing, Done) in your personal workspace, or an organization's with organization_id; parent_board_id nests it under a board of the same workspace. Board admins may update its settings (name, description, color like "#2563eb", visibility private/workspace/public, voting off/members/everyone, aging off/regular/pirate, is_template), archive it (read-only until restored), restore, delete (confirm: true; everything on it goes) or set_template (is_template, default true, so others can start boards from it). copy makes a new board with its columns, labels and custom fields (keep_ideas: true brings the open ideas): admins may copy any board, anyone who can see a template board may copy that. star and unstar pin it in your sidebar. Returns the board.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: create, update, archive, restore, delete, copy, star, unstar, set_template |
aging
|
string | One of: off, regular, pirate |
board_id
|
integer | Board id, from list_idea_boards |
color
|
string or null | Hex color like "#2563eb" |
confirm
|
boolean | Must be true to delete; deleting can't be undone |
copy_name
|
string | Name of the copy |
description
|
string or null | |
is_template
|
boolean | |
keep_ideas
|
boolean | copy: bring the open ideas |
name
|
string | |
organization_id
|
integer or null | Organization whose workspace gets the board (create, copy); for copy, null means your personal workspace (the default when you can't create boards in the source's organization) |
parent_board_id
|
integer or null | Board to nest it under; null un-nests it |
visibility
|
string | One of: private, workspace, public |
voting
|
string | One of: off, members, everyone |
manage_idea_column
write
Add, change, archive, restore, delete or reorder an idea board's columns (you need editor access). create adds a column at the end; done: true makes it a done column, where ideas are completed on entering and reopened on leaving; wip_limit caps how many ideas it should hold (null clears it). delete only works on an empty column (archive keeps its ideas). move puts the column at index position (0 is first) of all the board's columns, as get_idea_board lists them. Returns the board's columns.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: create, update, archive, restore, delete, move |
board_id
*
|
integer | Board id, from list_idea_boards |
column_id
|
integer | Column id, from get_idea_board or list_ideas |
done
|
boolean | |
name
|
string | |
position
|
string or integer | move: where among the board's columns: "top", "bottom" (default) or an index from 0 |
wip_limit
|
integer or null | Range 1– |
manage_idea_label
write
Create, rename/recolor or delete idea labels. A label belongs to one board (board editors manage it) or, with workspace: true, to the workspace of board_id, shared by all its boards (your personal workspace, which you manage, or an organization's, which its developers and up manage). update and delete take a label_id from get_idea_board, which lists both kinds. Deleting a label takes it off every idea. Returns the labels board_id can use.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: create, update, delete |
board_id
*
|
integer | Board id, from list_idea_boards |
color
|
string | Hex color like "#dc2626" |
label_id
|
integer | |
name
|
string | |
workspace
|
boolean | create: make it a workspace label instead of a board label. Default false |
manage_idea_member
write
Add, re-role or remove a board member, by username or user_id (board admins only; anyone may remove themselves to leave a board). Roles: viewer (read and comment), editor (add and change ideas, columns and labels), admin (also settings, members and deleting the board). Organization members may see a workspace board without being members. Returns the board's members.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: add, update, remove |
board_id
*
|
integer | Board id, from list_idea_boards |
role
|
string | add (default editor) and update. One of: admin, editor, viewer |
user_id
|
integer | |
username
|
string |
manage_idea_custom_field
write
Define a board's custom fields (board admins) or set one on an idea (editors). create takes a name and a kind (text, number, date, checkbox or dropdown, fixed once made), dropdown options as a list of names and show_on_card; update renames it or changes options (an option you leave out is cleared from ideas) or show_on_card; delete removes it with its values. set_value sets field_id on idea number: text, a number, a YYYY-MM-DD date, true/false for a checkbox, an option's name or id for a dropdown; null clears it. Returns the board's fields, or the idea for set_value.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: create, update, delete, set_value |
board_id
*
|
integer | Board id, from list_idea_boards |
field_id
|
integer | |
kind
|
string | One of: text, number, date, checkbox, dropdown |
name
|
string | |
number
|
integer | The idea's number on its board (#12 is 12) |
options
|
array of string | Dropdown option names, in order |
show_on_card
|
boolean | |
value
|
string or number or boolean or null |
list_ideas
read
List the open (non-archived) top-level ideas on an idea board in board order, with the board's columns so you can tell where each idea sits (column_id). state is "closed" for completed ideas; each idea carries its open sub-ideas and its comment, attachment and checklist item counts. Filters combine. Read one idea in full with get_idea.
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
assignee_ids
|
array or string | Ideas assigned to any of these user ids, or "me" |
completed
|
string | One of: include, exclude. Default "include" |
due
|
string | One of: overdue, today, week, none |
label_ids
|
array of integer | Ideas with any of these labels |
limit
|
integer | Range 1–200. Default 100 |
priority
|
integer | 1 is the most urgent, 4 means no priority. Range 1–4 |
repository_id
|
integer | Ideas linked to this project |
search
|
string | Text in the title or description |
templates
|
boolean | Include template ideas. Default false |
search_ideas
read
Find open ideas across all your idea boards with a Todoist-style filter query, such as "today & p1 | overdue", "@bug & #Roadmap" or "assigned to: me, no date". Operators: & (and), | (or), ! (not), parentheses; a comma separates queries, each returned as its own section. Terms: today, tomorrow, overdue, no date, next 7 days, date before: <date>, date after: <date>, a date like fri or jan 5, no time, recurring, deadline before: <date>, no deadline, created: today, p1-p4, #Board, ##Board (with sub-boards), /Column, @label, @label* (prefix), no labels, assigned to: me|others|<username>, assigned, no assignee, shared, search: <text>, view all. Ideas are ordered by due date. Read one in full with get_idea (board_id and number).
| Argument | Type | Notes |
|---|---|---|
filter
*
|
string | The filter query |
limit
|
integer | Most ideas per section. Range 1–200. Default 50 |
get_idea
read
Read one idea by board id and number: its description, column, parent, priority, dates, assignees, labels, custom fields, votes, watchers, linked project and issue, the boards it is mirrored on, checklists with their items (ids for manage_idea_checklist), sub-ideas, attachments, your reminders, the board's card buttons (editors run them with manage_idea_automation) and the 20 most recent comments (list_idea_timeline has the rest, with system activity).
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
create_idea
write
Add an idea to an idea board (you need editor access), all in one step: a failure adds nothing (but labels made by create_labels). It goes at the bottom of column_id, by default the first open column; with parent_number it becomes a sub-idea of that idea. Set people by username (assignees), labels by name (labels; create_labels: true adds missing ones to the board), a checklist, custom fields by name, and a project (repository) or a free-form project_name. from_template_number starts from a template idea of the board (its description, labels, checklists and custom fields; your arguments override them). Or pass quick_add, one line in the Todoist-style quick add syntax instead of the fields, e.g. "Call the bank #Errands /Next @money +alice p1 tomorrow 5pm for 30m every friday !1h" (#board, /column, @label, +assignee, p1-p4, dates and times, "for <duration>", "{<deadline>}", "every ..." repeats, "!<time>" reminders); without board_id it goes to the #board named or your Inbox. Returns the new idea with its number.
| Argument | Type | Notes |
|---|---|---|
assignees
|
array of string | Usernames of people who can see the board, or "me" |
board_id
|
integer | Board id, from list_idea_boards |
checklist
|
object | A checklist to add: {"name": "Steps", "items": ["Draft", "Review"]} |
column_id
|
integer | Column id, from get_idea_board or list_ideas |
create_labels
|
boolean | Add labels that don't exist yet to the board. Default false |
custom_fields
|
object | Field name or id => value: text, a number, a YYYY-MM-DD date, true for a checkbox or an option's name for a dropdown |
deadline
|
string | YYYY-MM-DD |
description
|
string | Markdown |
due_date
|
string | YYYY-MM-DD |
due_time
|
string | HH:MM, needs a due_date |
duration_minutes
|
integer or null | How long it takes, in minutes; null clears it. Range 1–1440 |
from_template_number
|
integer | Number of a template idea on this board to start from |
labels
|
array of string | Label names (board or workspace labels, any case) |
parent_id
|
integer | Id (not number) of the parent idea, instead of parent_number |
parent_number
|
integer | Number of the idea on this board to nest it under |
priority
|
integer | 1 is the most urgent; 4 (default) means no priority. Range 1–4 |
project_name
|
string | Free-form project name |
quick_add
|
string | One line of quick add syntax, instead of the other fields |
recurrence
|
string or null | Repeat phrase such as "every weekday at 9am", "every 2 weeks", "every 15th", "every! 3 days" (counted from completion) or "every day until dec 31"; null stops it. Completing a repeating idea moves it to its next due date instead. |
repository
|
integer or string or null | Project to link: id or full path such as "group/repo"; null unlinks |
repository_id
|
integer | Project id to link |
start_date
|
string | YYYY-MM-DD |
title
|
string |
update_idea
write
Change an idea (you need editor access). Only the arguments you pass change, all in one step: a failure changes nothing (but labels made by create_labels). assignees (usernames) or assignee_ids and labels (names; create_labels: true adds missing ones to the board first) or label_ids replace the current ones (pass [] to clear). repository links a project by id or path (null unlinks). column_id moves the idea to the bottom of that column (move_idea places it precisely or on another board); state_event "close" completes it (moving it to the done column, or a repeating idea to its next due date) and "reopen" reopens it. custom_fields sets the board's custom fields by id or name (see get_idea; null clears one).
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
assignee_ids
|
array of integer | User ids who can see the board |
assignees
|
array of string | Usernames of people who can see the board, or "me" |
column_id
|
integer | Column id, from list_ideas |
create_labels
|
boolean | Add labels that don't exist yet to the board. Default false |
custom_fields
|
object | Field id or name => value: text, a number, a YYYY-MM-DD date, true/false for a checkbox or an option's name for a dropdown; null clears it |
deadline
|
string or null | YYYY-MM-DD, or null to clear |
description
|
string or null | Markdown |
due_date
|
string or null | YYYY-MM-DD, or null to clear |
due_time
|
string or null | HH:MM, needs a due_date |
duration_minutes
|
integer or null | How long it takes, in minutes; null clears it. Range 1–1440 |
label_ids
|
array of integer | Ids of labels available on the board |
labels
|
array of string | Label names (board or workspace labels, any case) |
priority
|
integer | Range 1–4 |
project_name
|
string or null | Free-form project name |
recurrence
|
string or null | Repeat phrase such as "every weekday at 9am", "every 2 weeks", "every 15th", "every! 3 days" (counted from completion) or "every day until dec 31"; null stops it. Completing a repeating idea moves it to its next due date instead. |
repository
|
integer or string or null | Project to link: id or full path such as "group/repo"; null unlinks |
repository_id
|
integer or null | Project id to link |
start_date
|
string or null | YYYY-MM-DD, or null to clear |
state_event
|
string | One of: close, reopen |
title
|
string |
move_idea
write
Move an idea (you need editor access). On its board: to column_id (default its own column) at position "top", "bottom" (default) or an index among the column's cards, as list_ideas orders them. Entering a done column completes the idea (a repeating one moves to its next due date instead) and leaving one reopens it. A sub-idea is reordered among its siblings instead. With target_board_id it moves, with its sub-ideas, to the bottom of target_column_id (default the first open column) on that board, where it gets a new number; you need editor access there too. Returns the idea.
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
column_id
|
integer | Column id, from get_idea_board or list_ideas |
position
|
string or integer | Where in the column: "top", "bottom" (default) or an index from 0 |
target_board_id
|
integer | Board to move it to |
target_column_id
|
integer | Column of the target board |
transition_idea
write
One-step actions on an idea. complete (with its open sub-ideas, moving it to the board's done column; a repeating idea moves to its next due date instead) and reopen; archive (hidden with its sub-ideas until restored) and restore; delete (confirm: true, with its sub-ideas, can't be undone). copy duplicates it (content, checklists, labels, custom fields; not sub-ideas or comments) to target_board_id (default its own board) and target_column_id, optionally retitled: copying a template idea is how you create an idea from a template. convert_to_issue opens an issue from it in repository (id or path; default its linked project) and completes it, returning the issue too. vote/unvote when the board has voting on. watch/unwatch to be notified of its activity. mirror shows the same idea on another board (target_board_id, target_column_id) and unmirror takes it off target_board_id again. Editor access needed except for vote, watch and copy's source. Returns the idea (the copy, for copy).
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: complete, reopen, archive, restore, delete, copy, convert_to_issue, vote, unvote, watch, unwatch, mirror, unmirror |
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
confirm
|
boolean | Must be true to delete; deleting can't be undone |
repository
|
integer or string | convert_to_issue: project id or path such as "group/repo" |
target_board_id
|
integer | copy, mirror, unmirror |
target_column_id
|
integer | copy, mirror: column of the target board |
title
|
string | copy: title of the copy |
manage_idea_checklist
write
Change an idea's checklists (you need editor access); get_idea lists them with their ids. create_checklist (name), rename_checklist and delete_checklist take checklist_id. add_item adds text (optionally due_date YYYY-MM-DD and an assignee username) at the bottom of checklist_id; update_item changes an item's text, due_date or assignee (null clears them); toggle_item ticks or unticks it (pass done to set it either way); delete_item removes it; move_item puts it at position in checklist_id (default its own checklist); convert_item turns it into a sub-idea. Returns the idea.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: create_checklist, rename_checklist, delete_checklist, add_item, update_item, toggle_item, delete_item, move_item, convert_item |
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
assignee
|
string or null | Username of someone who can see the board, or "me" |
checklist_id
|
integer | |
done
|
boolean | toggle_item: the state to set |
due_date
|
string or null | YYYY-MM-DD |
item_id
|
integer | |
name
|
string | Checklist name |
position
|
string or integer | move_item: where in the checklist: "top", "bottom" (default) or an index from 0 |
text
|
string | Item text |
add_idea_comment
write
Comment on an idea (anyone who can view its board may). Markdown is supported, and @username mentions notify people who can see the board. Watchers are notified.
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
body
*
|
string | Markdown |
number
*
|
integer | The idea's number on its board (#12 is 12) |
manage_idea_comment
write
Change a comment on an idea, by note_id from get_idea or list_idea_timeline (add one with add_idea_comment). update replaces your own comment's body; delete removes your own comment (board admins may delete anyone's); react and unreact add or take back your emoji reaction (one of 👍 ❤️ 🎉 😄 👀 🚀) on any note. Returns the note (or that it was deleted).
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: update, delete, react, unreact |
board_id
*
|
integer | Board id, from list_idea_boards |
note_id
*
|
integer | |
number
*
|
integer | The idea's number on its board (#12 is 12) |
body
|
string | update: Markdown |
emoji
|
string | react, unreact: one emoji |
list_idea_timeline
read
Read an idea's timeline, oldest first: comments (with reactions) and system activity such as moves, completions, assignments and label changes (system: true, with the action). limit keeps the most recent notes.
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
limit
|
integer | Range 1–500. Default 100 |
add_idea_attachment
write
Attach a link (an http or https url, with an optional title) to an idea, or with action delete remove one of its attachments (attachment_id from get_idea; files uploaded in the web UI included). You need editor access. Returns the idea.
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
action
|
string | One of: add, delete. Default "add" |
attachment_id
|
integer | delete |
title
|
string | |
url
|
string |
list_idea_reminders
read
List your own reminders on an idea: when each fires (minutes_before its due date and time, or remind_at), on which channels and when it was last sent. manage_idea_reminder adds and deletes them.
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
manage_idea_reminder
write
Add or delete your own reminders on an idea (anyone who can see the board may; list_idea_reminders lists them). A reminder fires either minutes_before the idea's due date and time (9:00 when it has no time; it follows the due date when that changes, so 0 means "when it's due" and 1440 "a day before"), or once at a set moment: date (YYYY-MM-DD) and time (HH:MM) in your time zone, or remind_at, an ISO 8601 datetime such as 2026-10-15T09:00:00Z. It goes out on channels (in_app, email, slack; default your usual reminder channels). Returns your reminders on the idea.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: add, delete |
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
channels
|
array of string | Any of: in_app, email, slack |
date
|
string | YYYY-MM-DD, with time |
minutes_before
|
integer | Range 0–10080 |
remind_at
|
string | ISO 8601 datetime |
reminder_id
|
integer | delete |
time
|
string | HH:MM in your time zone, with date |
list_idea_filters
read
List your saved idea filters (named Todoist-style queries; search_ideas runs one, manage_idea_filter saves, changes and deletes them).
manage_idea_filter
write
Save, change or delete your saved idea filters (list_idea_filters lists them): named Todoist-style queries such as "today & p1 | overdue" (see search_ideas for the syntax, which also runs a query without saving it). favorite: true lists a filter in the Ideas sidebar. Returns your filters.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: create, update, delete |
color
|
string or null | Hex color like "#16a34a" |
favorite
|
boolean | |
filter_id
|
integer | update, delete |
name
|
string | |
query
|
string |
list_idea_templates
read
List what you can start from: template boards you can see (start a board from one with manage_idea_board action copy) and the template ideas on your boards (create an idea from one with create_idea from_template_number on its board, or transition_idea action copy onto another board).
run_idea_ai
write
Put AI to work on an idea with your own AI provider key (you need editor access). run_agent starts a freeform AI agent job on the idea's linked project (repository links one first; you need developer access there) with prompt, by default the idea's title, description, checklists and sub-ideas; if the agent changes code it opens a merge request, and the outcome is noted on the idea. Follow the job with get_ai_job. break_down asks the model for up to 10 sub-ideas, added to the idea in the background. provider, model and effort default to your last-used selection.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: run_agent, break_down |
board_id
*
|
integer | Board id, from list_idea_boards |
number
*
|
integer | The idea's number on its board (#12 is 12) |
background
|
boolean | run_agent: run in the background (default) or live. Default true |
effort
|
string | One of: low, medium, high, xhigh, max |
model
|
string | Model id; required except for Anthropic |
prompt
|
string | run_agent: what the agent should do |
provider
|
string | Slug of one of your AI provider keys, e.g. "anthropic" |
repository
|
integer or string | run_agent: project id or path to link the idea to first |
list_idea_automations
read
Read automations (board editors and admins; anyone else who can see the board gets only its enabled buttons from list): list the board's automations, get one by automation_id, or its recent runs (what each did, newest first). vocabulary (no board needed) lists every kind, scope, trigger, condition and action type with its params, for building automations with manage_idea_automation.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: list, get, runs, vocabulary |
automation_id
|
integer | get, runs |
board_id
|
integer | Board id, from list_idea_boards |
limit
|
integer | Range 1–100. Default 20 |
manage_idea_automation
write
Butler-style automation on an idea board. Kinds: rule (a trigger, optional conditions, then actions), card_button (actions run on one idea from its card; every idea has it, and it refuses one that fails its conditions), board_button (actions run over a scope of ideas) and schedule (a scope run on a 5-field cron schedule in the board owner's time zone, or for an organization's board the automation creator's: "0 9 * * *" daily, "0 9 * * 1-5" weekdays, "0 9 * * 1" Mondays, "0 9 1 * *" monthly; runs at least 5 minutes apart). A board holds at most 50 automations; a run over many ideas stops after 2,000 actions or 5,000 ideas scanned (a board button's also after 4 minutes) and goes on from there next time. Call list_idea_automations action vocabulary first for every trigger, condition and action type and its params (that tool also lists automations and their runs). Each is {"type": ..., params}: e.g. trigger {"type": "idea_moved", "to_column_id": 12}, conditions [{"type": "has_label", "label_id": 3}], actions [{"type": "set_priority", "priority": 1}, {"type": "assign", "user_id": "actor"}]; scope {"type": "all" | "column" (with column_id) | "completed" | "overdue" | "none"}. create, update, delete and toggle (on/off) need board admin; run presses a button as an editor: a card button runs now on the idea of `number`, a board button is queued ({"status": "queued"}, or "already_queued" while your run of it is pending or running, refused while you have 5 other button runs queued; its run shows in list_idea_automations runs once done). Automations act as whoever created or last changed them.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: create, update, delete, toggle, run |
board_id
*
|
integer | Board id, from list_idea_boards |
actions
|
array of object | |
automation_id
|
integer | |
conditions
|
array of object | |
enabled
|
boolean | |
kind
|
string | One of: rule, card_button, board_button, schedule |
name
|
string | |
number
|
integer | The idea's number on its board (#12 is 12) |
schedule
|
string or null | schedule: cron |
scope
|
object or null | board_button, schedule: which ideas |
trigger
|
object or null | rule: the trigger |
manage_idea_board_integrations
write
An idea board's connections to the outside. get returns your private calendar feed URLs (all your dated ideas, and this board's; subscribe to them in a calendar app; created on first use) and, for board admins, its email address (nil while email to board is off) and what get_idea_board_integrations lists: webhooks and Slack subscriptions. Board admins can: enable_email (editors then email ideas to the address; [#12] in the subject comments on idea 12), disable_email or regenerate_email (a new address; the old one stops working); add_webhook (url, events, optional secret: sent as X-Gitlab-Token and used to sign the body as X-Hub-Signature-256), delete_webhook or ping_webhook (a test delivery) by webhook_id; add_slack (channel name, features) or remove_slack by subscription_id. Events and features: idea_created, idea_updated, idea_moved, idea_completed, idea_reopened, idea_archived, idea_restored, idea_deleted, comment_added; a webhook gets all of them by default, a Slack channel all but idea_updated.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: get, enable_email, disable_email, regenerate_email, add_webhook, delete_webhook, ping_webhook, add_slack, remove_slack |
board_id
*
|
integer | Board id, from list_idea_boards |
channel
|
string | add_slack: e.g. "#roadmap" |
events
|
array of string | add_webhook: events to send. Any of: idea_created, idea_updated, idea_moved, idea_completed, idea_reopened, idea_archived, idea_restored, idea_deleted, comment_added |
features
|
array of string | add_slack: events to post. Any of: idea_created, idea_updated, idea_moved, idea_completed, idea_reopened, idea_archived, idea_restored, idea_deleted, comment_added |
secret
|
string | add_webhook: secret token |
subscription_id
|
integer | |
url
|
string | add_webhook: an http(s) URL |
webhook_id
|
integer |
export_idea_board
read
Export a whole idea board, archived ideas included: json (the board, columns, labels, custom fields and every idea with its checklists, values and comments) or csv (one row per idea). Boards over 500 KB come back as a download URL of the REST API instead, to fetch with your token.
| Argument | Type | Notes |
|---|---|---|
board_id
*
|
integer | Board id, from list_idea_boards |
format
|
string | One of: json, csv. Default "json" |
import_ideas
write
Import into your personal workspace, or organization_id's (you need developer access there), in the background: you are notified when it is done. trello: trello_json is the text of a Trello board's JSON export (Menu, Print, export and share, Export as JSON; at most 8 MB, the request size limit); it becomes a new board with its lists, cards, labels, checklists, comments and due dates. todoist: todoist_token is a Todoist API token (Settings, Integrations, Developer); every project becomes a board with its open tasks. One import at a time.
| Argument | Type | Notes |
|---|---|---|
source
*
|
string | One of: trello, todoist |
organization_id
|
integer | |
todoist_token
|
string | |
trello_json
|
string |
Search
search
read
Search the projects, issues and merge requests (by title and description) or code (files on default branches that match) you can see. Pass project to search one project.
| Argument | Type | Notes |
|---|---|---|
query
*
|
string | |
scope
*
|
string | One of: code, issues, merge_requests, projects |
limit
|
integer | Range 1–50. Default 20 |
project
|
integer or string | Project id or full path, e.g. 42 or "group/repo" |
Mirrors
sync_github_mirrors
write
Manage GitHub pull mirrors for every repository of a group (organization). action add_mirrors gives each repo a GitHub pull mirror that tracks GitHub every 15 minutes, including issues and pull requests, and never deletes branches created in GitBlixt; repos with no recorded GitHub source get <github_owner>/<repo name> recorded as one; repos that already have a mirror are skipped. action refresh queues a sync of all the group's GitHub pull mirrors now. Needs group owner access and your GitHub account connected.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: add_mirrors, refresh |
group
*
|
string | Group slug, e.g. "my-org" |
github_owner
|
string | add_mirrors only: GitHub user or org owning the repos that have no recorded GitHub source |
Admin
get_server_logs
admin, read
Admin only: read GitBlixt's own server logs (its Docker container/service output), oldest to newest, optionally filtered by a case-insensitive substring. Covers the most recent 5000 lines.
| Argument | Type | Notes |
|---|---|---|
limit
|
integer | Range 1–1000. Default 200 |
query
|
string | Case-insensitive substring to match |
list_backups
admin, read
Admin only: list GitBlixt backups, newest first: status, storage, contents (with each app volume copied), size, timing and any error or warnings.
| Argument | Type | Notes |
|---|---|---|
limit
|
integer | Range 1–100. Default 20 |
start_backup
admin, write
Admin only: start a backup of the database, git repositories, uploads and/or app environment volumes. Runs asynchronously; follow it with list_backups.
| Argument | Type | Notes |
|---|---|---|
includes
|
array of string | What to back up; defaults to everything. Any of: database, repos, uploads, volumes |
get_instance_limits
admin, read
Admin only: read the instance limits of Admin → Limits (feature flag defaults, user and organization quota defaults, app log retention, CI/AI/service container CPU and memory, build and deploy concurrency, CI workspace and cache caps, app volume and managed database caps, package file cap, egress controls) and the AI concurrency caps. Sections with a config default (container limits, build concurrency, CI workspaces, app volumes, app databases, packages) say whether the value is an override. Change them with manage_instance_limits.
| Argument | Type | Notes |
|---|---|---|
section
|
string | Return only this section; defaults to all. One of: feature_defaults, quota_defaults, org_quota_defaults, log_retention, container_limits, build_concurrency, ci_workspaces, app_volumes, app_databases, packages, egress, ai_concurrency |
manage_instance_limits
admin, write
Admin only: set or reset an instance limit section (see get_instance_limits). `set` changes the fields given in `values`: feature_defaults {<feature key>: bool}; quota_defaults {storage_bytes, repo_count, ci_minutes_per_month, ai_calls_per_hour}; org_quota_defaults {storage_bytes, repo_count, ci_minutes_per_month} (quota fields: positive integer; 0 or null = unlimited); log_retention {days}; container_limits {kind: job|ai|service, cpus, memory}, e.g. 0.5 and 512m; build_concurrency {queue: ci_builds|deploys, limit >= 1}; ci_workspaces {max_age_hours >= 1, build_cache_max_gb >= 0, toolchains_max_gb >= 0}, all three; app_volumes {max_gb >= 0, 0 = unlimited}; app_databases {max_gb >= 0, 0 = unlimited}; packages {max_file_mb >= 1}; egress {allow_private: bool, allowlist_hosts: [hostname]}; ai_concurrency {max_concurrent_jobs, max_concurrent_per_repo}, 1 to 100. `reset` restores the config default of container_limits (values.kind), build_concurrency (values.queue), ci_workspaces, app_volumes, app_databases or packages. Returns the section's new values.
| Argument | Type | Notes |
|---|---|---|
action
*
|
string | One of: set, reset |
section
*
|
string | One of: feature_defaults, quota_defaults, org_quota_defaults, log_retention, container_limits, build_concurrency, ci_workspaces, app_volumes, app_databases, packages, egress, ai_concurrency |
values
|
object | Fields to set (required for set), or the kind/queue to reset for container_limits and build_concurrency |
* required
Databases
describe_database
and query_database
give the same access to an environment's database as the browser DB editor, and need
the same setup:
- An admin turns on the DB editor for environments under Admin → Settings → DB editor.
-
Your account has the
db_admin:environmentsadmin permission, and you have write access to the project.
Queries are read-only unless allow_write
is set, which needs an api
token. Reads can't write files, cancel or terminate other connections, or take session
locks. With allow_write, only INSERT, REPLACE, MERGE, and UPDATE/DELETE
with a WHERE
run; schema changes and everything else go through the browser editor. Every query is
recorded in the DB editor's audit log. Database credentials are never returned.
Environments and variables
create_environment
takes the New environment page's settings. With managed_db
it also creates the environment's Postgres database straight away and sets DATABASE_URL;
provision_database
does the same for an existing environment, and is the retry if creating the database
failed.
Environment variable values never appear in a response. set_env_var
takes a literal value, which passes through the agent's transcript, or one
of two ways to keep a secret out of it: generate
makes random bytes on the server and encodes them (base64, base64url or hex), and
copy_from
copies another environment's value on the server, e.g. production's POOL_SIZE
into staging. Changes reach the app on its next deploy.
AI jobs
Every AI job gets this server automatically, with nothing to configure. Its token is created when the agent starts and deleted when it finishes. It is read-only and restricted to the job's repository, so the agent can read issues, merge request threads, CI logs and app logs but can't change anything, read CI variables or webhooks, use admin, database, snippet or email-credential tools, or reach other projects.
Agent containers connect to https://git.michlp.com/mcp. If they can't reach
GitBlixt's public address, for example in a local Docker Compose setup, set
Admin → Settings → AI Settings → Agent base URL to an address they can reach, such as http://gitblixt:4000. The
GITBLIXT_AGENT_BASE_URL
environment variable is the fallback for fresh installs.
Limits and troubleshooting
-
The endpoint allows 120 requests a minute.
gitlab_apicalls also count toward the REST API's own limit. - 401 Unauthorized: the token is missing, mistyped, revoked or expired.
- A tool is missing from the list: the token lacks the scope for it, it's an admin tool and the account isn't an admin, or it's an AI job token and the tool isn't bound to one project.
- "Deployment is not enabled for this project": the app tools only work for projects with deployments turned on in their settings.
- "You need at least developer access to this project": the tool needs a higher project role than the token's user has.
- "This token is restricted to project N": an AI job token was used outside its own repository.