Base URL precedence (highest to lowest):
temporary_base_url — one-time use URL for specific operations
user_base_url — user-defined URL for the current session
MANTIS_BASE_URL — environment default URL
This allows you to:
Example:
// Default: uses MANTIS_BASE_URL from environment
GET {{resolved_base_url}}/issues
// Override for one operation:
temporary_base_url = "https://mantis-staging.example.com/api/rest"
GET {{resolved_base_url}}/issues
// Override for session:
user_base_url = "https://client-mantis.example.com/api/rest"
GET {{resolved_base_url}}/issues
Token precedence (highest to lowest):
temporary_token — one-time use token for specific operations
user_token — user-defined token for the current session
MANTIS_API_TOKEN — environment default token
Environment variables are handled via standard OpenClaw metadata: requires.env declares required variables (MANTIS_BASE_URL, MANTIS_API_TOKEN). Any other environment variables you use for Mantis should be treated as normal process env vars and are not modeled as special OpenClaw metadata fields.
All API requests must include:
Authorization: Bearer {{resolved_token}}
Content-Type: application/json
Note: The {{resolved_base_url}} and {{resolved_token}} are determined at runtime based on the precedence rules above.
Throughout this documentation:
{{MANTIS_BASE_URL}} refers to the resolved base URL (could be temporary_base_url, user_base_url, or env MANTIS_BASE_URL)
{{resolved_token}} refers to the resolved token (could be temporary_token, user_token, or env MANTIS_API_TOKEN)
{{MANTIS_BASE_URL}}/resource/path
Important: Always use the resolution logic to determine the actual URL and token at runtime.
> The temporary_ and user_ names here are runtime context variables used by the skill logic, not OpenClaw metadata fields. OpenClaw does not define an optional.context metadata key; context is resolved dynamically at runtime as described below.
User queries:
Action:
Set temporary_base_url = "https://staging.mantis.com/api/rest"
Set temporary_token = "ABC123"
... perform operation ...
Clear temporary_base_url
Clear temporary_token
Behavior: Temporary values are automatically cleared after one use.
User queries:
Action:
Set user_base_url = "https://client-xyz.mantis.com/api/rest"
Set user_token = "personal_token_123"
... perform multiple operations ...
// Values persist for the entire session
Behavior: Session values persist until explicitly cleared or session ends.
User queries:
Action:
Clear user_base_url
Clear user_token
// Now uses MANTIS_BASE_URL and MANTIS_API_TOKEN from environment
User queries:
Response should show:
Current Context:
- Base URL: https://client-xyz.mantis.com/api/rest (user_base_url)
- Token: user_t***123 (user_token)
- Fallback Base URL: https://default.mantis.com/api/rest (MANTIS_BASE_URL)
- Fallback Token: env_t***789 (MANTIS_API_TOKEN)
// Check production issue
Set temporary_base_url = "https://prod.mantis.com/api/rest"
Get issue 123
// Check staging issue
Set temporary_base_url = "https://staging.mantis.com/api/rest"
Get issue 123
// Compare results
// Switch to Client A
Set user_base_url = "https://clienta.mantis.com/api/rest"
Set user_token = "clienta_token"
List all projects
Get issues for project 5
// Switch to Client B
Set user_base_url = "https://clientb.mantis.com/api/rest"
Set user_token = "clientb_token"
List all projects
Get issues for project 3
// Connect to main instance as admin
Set user_token = "admin_token"
// Perform operation as specific user
Set temporary header: X-Impersonate-User = "john.doe"
Get user issues
// Back to admin
Clear temporary header
User queries:
Actions:
GET {{MANTIS_BASE_URL}}/issues
Query Parameters:
page_size — number of issues per page (default: 50)
page — page number (1-indexed)
filter_id — ID of saved filter to apply
project_id — filter by specific project
select — comma-separated fields to return (e.g., "id,summary,status")
Special endpoints:
GET {{MANTIS_BASE_URL}}/issues?filter_id={{filter_id}}
GET {{MANTIS_BASE_URL}}/projects/{{project_id}}/issues
User queries:
Action:
GET {{MANTIS_BASE_URL}}/issues/{{id}}
User queries:
Action:
POST {{MANTIS_BASE_URL}}/issues
Minimal body:
{
"summary": "Issue summary",
"description": "Detailed description",
"category": {"name": "General"},
"project": {"id": 1}
}
Full body (optional fields):
{
"summary": "Issue summary",
"description": "Detailed description",
"steps_to_reproduce": "1. Do this\n2. Do that",
"additional_information": "Extra info",
"category": {"id": 1, "name": "General"},
"project": {"id": 1},
"priority": {"id": 30, "name": "normal"},
"severity": {"id": 50, "name": "minor"},
"status": {"id": 10, "name": "new"},
"reproducibility": {"id": 10, "name": "always"},
"handler": {"id": 5},
"tags": [{"name": "bug"}, {"name": "ui"}],
"custom_fields": [{"field": {"id": 1}, "value": "custom value"}],
"due_date": "2026-12-31T23:59:59+00:00",
"version": {"name": "1.0"},
"target_version": {"name": "2.0"}
}
Create with attachments:
POST {{MANTIS_BASE_URL}}/issues
Include files array in body with base64-encoded content.
User queries:
Action:
PATCH {{MANTIS_BASE_URL}}/issues/{{id}}
Example body:
{
"status": {"name": "resolved"},
"handler": {"id": 10},
"priority": {"name": "high"},
"summary": "Updated summary"
}
User queries:
Action:
DELETE {{MANTIS_BASE_URL}}/issues/{{id}}
User queries:
Actions:
POST {{MANTIS_BASE_URL}}/issues/{{id}}/monitors
DELETE {{MANTIS_BASE_URL}}/issues/{{id}}/monitors
Body (for specific user):
{
"user": {"id": 10}
}
User queries:
Actions:
POST {{MANTIS_BASE_URL}}/issues/{{id}}/tags
PATCH {{MANTIS_BASE_URL}}/issues/{{id}}/tags
DELETE {{MANTIS_BASE_URL}}/issues/{{id}}/tags
Body:
{
"tags": [
{"name": "bug"},
{"name": "critical"}
]
}
User queries:
Action:
POST {{MANTIS_BASE_URL}}/issues/{{id}}/relationships
Body:
{
"type": {"name": "duplicate-of"},
"target_issue": {"id": 456}
}
Relationship types:
duplicate-of
related-to
parent-of
child-of
has-duplicate
User queries:
Action:
POST {{MANTIS_BASE_URL}}/issues/{{id}}/files
Body:
{
"files": [
{
"name": "screenshot.png",
"content": "base64_encoded_content_here"
}
]
}
User queries:
Action:
DELETE {{MANTIS_BASE_URL}}/issues/{{issue_id}}/files/{{file_id}}
User queries:
Action:
POST {{MANTIS_BASE_URL}}/issues/{{id}}/notes
Body:
{
"text": "Note content here",
"view_state": {"name": "public"},
"time_tracking": "PT2H30M"
}
With attachment:
{
"text": "Note with file",
"files": [
{
"name": "log.txt",
"content": "base64_content"
}
]
}
User queries:
Action:
DELETE {{MANTIS_BASE_URL}}/issues/{{issue_id}}/notes/{{note_id}}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/projects
User queries:
Action:
GET {{MANTIS_BASE_URL}}/projects/{{id}}
User queries:
Action:
POST {{MANTIS_BASE_URL}}/projects
Body:
{
"name": "Project Name",
"description": "Project description",
"enabled": true,
"inherit_global": true,
"view_state": {"name": "public"},
"status": {"name": "development"}
}
User queries:
Action:
PATCH {{MANTIS_BASE_URL}}/projects/{{id}}
User queries:
Action:
DELETE {{MANTIS_BASE_URL}}/projects/{{id}}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/projects/{{id}}/subprojects
User queries:
Action:
POST {{MANTIS_BASE_URL}}/projects/{{id}}/subprojects
Body:
{
"subproject": {"id": 10}
}
Action:
DELETE {{MANTIS_BASE_URL}}/projects/{{id}}/subprojects/{{subproject_id}}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/projects/{{id}}/users
User queries:
Action:
POST {{MANTIS_BASE_URL}}/projects/{{id}}/users
Body:
{
"user": {"id": 20},
"access_level": {"name": "developer"}
}
Access levels:
viewer (10)
reporter (25)
updater (40)
developer (55)
manager (70)
administrator (90)
Action:
DELETE {{MANTIS_BASE_URL}}/projects/{{project_id}}/users/{{user_id}}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/projects/{{id}}/versions
User queries:
Action:
POST {{MANTIS_BASE_URL}}/projects/{{id}}/versions
Body:
{
"name": "2.0",
"description": "Major release",
"released": true,
"obsolete": false,
"timestamp": "2026-06-01T00:00:00+00:00"
}
Action:
PATCH {{MANTIS_BASE_URL}}/projects/{{project_id}}/versions/{{version_id}}
Action:
DELETE {{MANTIS_BASE_URL}}/projects/{{project_id}}/versions/{{version_id}}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/users/me
User queries:
Action:
GET {{MANTIS_BASE_URL}}/users/{{id}}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/users?name={{username}}
User queries:
Action:
POST {{MANTIS_BASE_URL}}/users
Minimal body:
{
"username": "jane.smith",
"email": "jane@example.com",
"access_level": {"name": "reporter"}
}
Full body:
{
"username": "jane.smith",
"password": "SecurePass123!",
"real_name": "Jane Smith",
"email": "jane@example.com",
"access_level": {"name": "developer"},
"enabled": true,
"protected": false
}
User queries:
Action:
PATCH {{MANTIS_BASE_URL}}/users/{{id}}
Body:
{
"real_name": "Updated Name",
"email": "new@example.com",
"access_level": {"name": "developer"},
"enabled": false
}
User queries:
Action:
PUT {{MANTIS_BASE_URL}}/users/{{id}}/reset-password
Body:
{
"password": "NewSecurePassword123!"
}
User queries:
Action:
DELETE {{MANTIS_BASE_URL}}/users/{{id}}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/filters
User queries:
Action:
GET {{MANTIS_BASE_URL}}/filters/{{id}}
User queries:
Action:
DELETE {{MANTIS_BASE_URL}}/filters/{{id}}
User queries:
Action:
POST {{MANTIS_BASE_URL}}/user_tokens
Body:
{
"name": "automation_token",
"date_expiry": "2027-12-31T23:59:59+00:00"
}
User queries:
Action:
DELETE {{MANTIS_BASE_URL}}/user_tokens/{{token_id}}
User queries:
Action:
POST {{MANTIS_BASE_URL}}/users/{{user_id}}/tokens
Body:
{
"name": "user_token",
"date_expiry": "2027-12-31T23:59:59+00:00"
}
Action:
DELETE {{MANTIS_BASE_URL}}/users/{{user_id}}/tokens/{{token_id}}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/config/{{option}}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/config
Query parameters:
option — specific option name
project_id — filter by project
user_id — filter by user
User queries:
Action:
PATCH {{MANTIS_BASE_URL}}/config
Body:
{
"configs": [
{
"option": "allow_signup",
"value": "1"
}
]
}
User queries:
Action:
GET {{MANTIS_BASE_URL}}/lang/{{string}}
Query parameter:
language — language code (e.g., 'fr', 'en', 'de')
User queries:
Action:
GET {{MANTIS_BASE_URL}}/lang
Query parameters:
strings — comma-separated list of string keys
language — language code
User queries:
Action:
GET {{MANTIS_BASE_URL}}/users/me
Header:
X-Impersonate-User: {{username_or_id}}
Handle HTTP errors gracefully:
401 Unauthorized:
MANTIS_API_TOKEN or provide valid temporary_token
403 Forbidden:
404 Not Found:
422 Unprocessable Entity:
500 Internal Server Error:
General error response format:
{
"message": "Error description",
"code": 1234,
"localized": "Localized error message"
}
page_size and page parameters for list operations
select parameter to return only needed fields
select=id,summary,status,priority
filter_id to apply saved filters
project_id
PT2H30M (2 hours 30 minutes)
2026-12-31T23:59:59+00:00
1. POST /issues with summary and description
2. POST /issues/{{new_id}}/monitors to monitor
1. PATCH /issues/{{id}} with handler
2. POST /issues/{{id}}/notes with assignment comment
1. POST /projects with project details
2. POST /projects/{{id}}/versions with version info
1. POST /users to create user
2. POST /projects/{{id}}/users to add to project
3. POST /users/{{id}}/tokens to create API token
When updating multiple issues:
Get all high-priority bugs:
1. GET /filters to find priority filter ID
2. GET /issues?filter_id={{filter_id}}&page_size=100
3. Process paginated results
Copy project structure:
1. GET /projects/{{source_id}} to get project details
2. GET /projects/{{source_id}}/versions for versions
3. POST /projects to create new project
4. POST /projects/{{new_id}}/versions for each version
Track user activity:
1. GET /issues?reporter_id={{user_id}}
2. GET /issues?handler_id={{user_id}}
3. GET /issues?monitor_id={{user_id}}
4. Compile activity report
Work with multiple Mantis instances:
// Scenario: Compare issue status across environments
1. Check production:
Set temporary_base_url = "https://prod.mantis.com/api/rest"
Set temporary_token = "prod_token"
GET /issues/123
Record status
2. Check staging:
Set temporary_base_url = "https://staging.mantis.com/api/rest"
Set temporary_token = "staging_token"
GET /issues/123
Record status
3. Compare and report differences
Sync data between instances:
// Scenario: Clone project from one instance to another
1. Connect to source instance:
Set user_base_url = "https://source.mantis.com/api/rest"
Set user_token = "source_token"
GET /projects/5 (get project details)
GET /projects/5/versions (get versions)
GET /projects/5/users (get users)
2. Connect to target instance:
Set user_base_url = "https://target.mantis.com/api/rest"
Set user_token = "target_token"
POST /projects (create project)
POST /projects/{{new_id}}/versions (create versions)
POST /projects/{{new_id}}/users (add users)
3. Report sync results
Manage multiple client instances:
// Scenario: Daily status report for all clients
For each client in [ClientA, ClientB, ClientC]:
1. Set user_base_url = client.mantis_url
2. Set user_token = client.api_token
3. GET /issues?filter_id=1 (get today's issues)
4. Collect statistics
5. Clear context
Generate consolidated report
{{MANTIS_BASE_URL}}/api/rest/swagger.yaml
This skill enables you to:
共 1 个版本