MCP server providing AI-powered integration with Redmine and ServiceNow for task management, incident handling, and change request tracking
This server has 10 tools bridging Redmine and ServiceNow. Strengths: all tools have clear action-verb names (get_, create_, update_, delete_), explicit descriptions, and visible Zod schemas with types and descriptions. Medium-length descriptions provide context. Weaknesses: descriptions lack error recovery guidance, no confirmation mechanism for destructive operations (delete_redmine_issue, delete_servicenow_record), output schemas not formally documented, pagination/response structure not fully specified, and parameters could benefit from more granular constraints (e.g., enums for ServiceNow table names, status codes). Parameter descriptions are present but formulaic. No evidence of rate limiting, input sanitization, or permission gating. API keys correctly injected via environment variables (good security). Tool composition is reasonable, each tool has one responsibility. Average across tools: 62/100.
Create a new issue in Redmine
Create a new incident in ServiceNow
Create a record in any ServiceNow table (e.g. incident, problem, change)
Delete an issue from Redmine. Use with caution as this is irreversible.
Delete a record from any ServiceNow table. Use with caution as this is irreversible.
Get issues from Redmine
Destructive operations (delete_redmine_issue, delete_servicenow_record) lack confirmation/dry-run mechanism. Descriptions warn of irreversibility but offer no protection against accidental execution by agents.
Output schemas not formally documented. Tools return JSON.stringify(data) but what fields are returned, what are optional, what types, none of this is specified for LLM consumption. LLM must infer structure from API responses.
No error handling guidance in tool descriptions. When a tool fails (e.g., project_id not found, API timeout, permission denied), LLM has no recovery path. No actionable error messages or classification (retryable vs fatal).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
Get incidents from ServiceNow. Use offset for pagination. Response includes total and has_more so you can page through all records.
Get records from any ServiceNow table with pagination support. Table examples: incident, problem, change_request, sc_request Query syntax (sysparm_query format): - Simple: "state=1" - AND: "state=1^priority=2" - Dot-walk (reference field): "problem_id.number=PRB0040002" - Name search: "caller_id.name=John Doe" - Contains: "short_descriptionLIKEnetwork" Set display_value=true to show human-readable values for reference fields (caller name, group name, etc.) Pagination: use offset to page through results (e.g. offset=0, offset=100, offset=200...). Response includes total count and has_more flag — keep calling with increasing offset while has_more=true.
Update an existing issue in Redmine. status_id: 1=New, 2=In Progress, 3=Resolved, 4=Feedback, 5=Closed, 6=Rejected priority_id: 1=Low, 2=Normal, 3=High, 4=Urgent, 5=Immediate
Update a record in any ServiceNow table. State values by table: incident: 1=New, 2=In Progress, 3=On Hold, 6=Resolved, 7=Closed problem: 100=Open, 102=Known Error, 103=Pending Change, 104=Closed/Resolved change_request: -5=New, -4=Assess, -3=Authorize, -2=Scheduled, -1=Implement, 0=Review, 3=Closed close_code examples (incident): "Solved (Permanently)", "Solved (Work Around)", "Not Solved (Not Reproducible)" Use work_notes to add internal notes without notifying the caller. Link fields (use sys_id values): problem_id: link incident to a problem record rfc: link incident to a change_request record parent_incident: link incident to a parent incident
ServiceNow table names (incident, problem, change_request, sc_request) not constrained as enum. LLM can hallucinate invalid table names. Descriptions list examples but without enum constraint, LLM may invent others.
Pagination response structure underdocumented. get_servicenow_incidents returns has_more and total, but this is not formally declared in any response schema. LLM cannot reliably know the shape of responses.
update_redmine_issue and update_servicenow_record accept numerous optional parameters but do not document dependencies. E.g., which fields can be updated simultaneously? Are there conflicts? Is partial update atomicity guaranteed?