Add friendly redMCP query options
This commit is contained in:
@@ -92,7 +92,11 @@ final class McpDispatcher
|
||||
{
|
||||
return [
|
||||
$this->tool('redmine_list_projects', 'List Redmine projects using native /projects.json.', [
|
||||
'params' => ['type' => 'object', 'description' => 'Redmine project list params such as include, offset, and limit.'],
|
||||
'limit' => ['type' => 'integer', 'minimum' => 1, 'maximum' => 100],
|
||||
'page' => ['type' => 'integer', 'minimum' => 1],
|
||||
'offset' => ['type' => 'integer', 'minimum' => 0],
|
||||
'sort' => ['description' => 'Sort shortcut such as newest, oldest, created_newest, or a Redmine sort string.'],
|
||||
'params' => ['type' => 'object', 'description' => 'Raw Redmine project list params; overrides friendly fields on conflict.'],
|
||||
]),
|
||||
$this->tool('redmine_get_project', 'Fetch one Redmine project by id or identifier.', [
|
||||
'project_id' => ['type' => ['string', 'integer'], 'description' => 'Redmine numeric project id or identifier.'],
|
||||
@@ -100,25 +104,70 @@ final class McpDispatcher
|
||||
], ['project_id']),
|
||||
$this->tool('redmine_list_project_memberships', 'List users/groups and roles for a Redmine project.', [
|
||||
'project_id' => ['type' => ['string', 'integer'], 'description' => 'Redmine numeric project id or identifier.'],
|
||||
'params' => ['type' => 'object', 'description' => 'Redmine membership list params such as offset and limit.'],
|
||||
'limit' => ['type' => 'integer', 'minimum' => 1, 'maximum' => 100],
|
||||
'page' => ['type' => 'integer', 'minimum' => 1],
|
||||
'offset' => ['type' => 'integer', 'minimum' => 0],
|
||||
'sort' => ['description' => 'Sort shortcut such as newest, oldest, created_newest, or a Redmine sort string.'],
|
||||
'params' => ['type' => 'object', 'description' => 'Raw Redmine membership list params; overrides friendly fields on conflict.'],
|
||||
], ['project_id']),
|
||||
$this->tool('redmine_list_users', 'List Redmine users using native /users.json.', [
|
||||
'params' => ['type' => 'object', 'description' => 'Redmine user list params such as status, name, group_id, offset, and limit.'],
|
||||
'status' => ['description' => 'User status such as active, registered, locked, all, or a Redmine status id.'],
|
||||
'name' => ['type' => 'string', 'description' => 'Filter users by name.'],
|
||||
'group_id' => ['type' => ['string', 'integer'], 'description' => 'Filter users by group id.'],
|
||||
'limit' => ['type' => 'integer', 'minimum' => 1, 'maximum' => 100],
|
||||
'page' => ['type' => 'integer', 'minimum' => 1],
|
||||
'offset' => ['type' => 'integer', 'minimum' => 0],
|
||||
'sort' => ['description' => 'Sort shortcut such as newest, oldest, created_newest, or a Redmine sort string.'],
|
||||
'params' => ['type' => 'object', 'description' => 'Raw Redmine user list params; overrides friendly fields on conflict.'],
|
||||
]),
|
||||
$this->tool('redmine_get_user', 'Fetch one Redmine user by id.', [
|
||||
'user_id' => ['type' => 'integer'],
|
||||
'params' => ['type' => 'object', 'description' => 'Optional Redmine user params such as include=memberships,groups.'],
|
||||
], ['user_id']),
|
||||
$this->tool('redmine_list_issues', 'List Redmine issues using native /issues.json filters.', [
|
||||
'filters' => ['type' => 'object', 'description' => 'Redmine issue list filters such as project_id, status_id, query_id, sort, offset, and limit.'],
|
||||
'project_id' => ['type' => ['string', 'integer']],
|
||||
'status' => ['description' => 'Issue status such as open, closed, all, or a Redmine status id.'],
|
||||
'status_id' => ['description' => 'Raw Redmine status id or status token.'],
|
||||
'tracker_id' => ['type' => ['string', 'integer']],
|
||||
'assigned_to_id' => ['type' => ['string', 'integer']],
|
||||
'author_id' => ['type' => ['string', 'integer']],
|
||||
'priority_id' => ['type' => ['string', 'integer']],
|
||||
'category_id' => ['type' => ['string', 'integer']],
|
||||
'query_id' => ['type' => ['string', 'integer']],
|
||||
'created' => ['description' => 'Friendly created_on date filter such as today, last 7 days, since 2026-04-01, or {from,to}.'],
|
||||
'updated' => ['description' => 'Friendly updated_on date filter such as today, last 7 days, since 2026-04-01, or {from,to}.'],
|
||||
'due' => ['description' => 'Friendly due_date filter such as today, last 7 days, since 2026-04-01, or {from,to}.'],
|
||||
'limit' => ['type' => 'integer', 'minimum' => 1, 'maximum' => 100],
|
||||
'page' => ['type' => 'integer', 'minimum' => 1],
|
||||
'offset' => ['type' => 'integer', 'minimum' => 0],
|
||||
'sort' => ['description' => 'Sort shortcut such as newest, oldest, priority, or a Redmine sort string.'],
|
||||
'filters' => ['type' => 'object', 'description' => 'Raw Redmine issue list filters; overrides friendly fields on conflict.'],
|
||||
]),
|
||||
$this->tool('redmine_search', 'Search Redmine using native /search.json.', [
|
||||
'query' => ['type' => 'string'],
|
||||
'params' => ['type' => 'object', 'description' => 'Redmine search params such as project_id, all_words, titles_only, offset, and limit.'],
|
||||
'project_id' => ['type' => ['string', 'integer']],
|
||||
'scope' => ['type' => 'string'],
|
||||
'all_words' => ['type' => ['boolean', 'string', 'integer']],
|
||||
'titles_only' => ['type' => ['boolean', 'string', 'integer']],
|
||||
'open_issues' => ['type' => ['boolean', 'string', 'integer']],
|
||||
'limit' => ['type' => 'integer', 'minimum' => 1, 'maximum' => 100],
|
||||
'page' => ['type' => 'integer', 'minimum' => 1],
|
||||
'offset' => ['type' => 'integer', 'minimum' => 0],
|
||||
'sort' => ['description' => 'Sort shortcut such as newest, oldest, created_newest, or a Redmine sort string.'],
|
||||
'params' => ['type' => 'object', 'description' => 'Raw Redmine search params; overrides friendly fields on conflict.'],
|
||||
], ['query']),
|
||||
$this->tool('redmine_search_issues', 'Search only issues using native /search.json.', [
|
||||
'query' => ['type' => 'string'],
|
||||
'params' => ['type' => 'object', 'description' => 'Additional Redmine search params.'],
|
||||
'project_id' => ['type' => ['string', 'integer']],
|
||||
'scope' => ['type' => 'string'],
|
||||
'all_words' => ['type' => ['boolean', 'string', 'integer']],
|
||||
'titles_only' => ['type' => ['boolean', 'string', 'integer']],
|
||||
'open_issues' => ['type' => ['boolean', 'string', 'integer']],
|
||||
'limit' => ['type' => 'integer', 'minimum' => 1, 'maximum' => 100],
|
||||
'page' => ['type' => 'integer', 'minimum' => 1],
|
||||
'offset' => ['type' => 'integer', 'minimum' => 0],
|
||||
'sort' => ['description' => 'Sort shortcut such as newest, oldest, created_newest, or a Redmine sort string.'],
|
||||
'params' => ['type' => 'object', 'description' => 'Raw Redmine search params; overrides friendly fields on conflict.'],
|
||||
], ['query']),
|
||||
$this->tool('redmine_get_issue', 'Fetch one Redmine issue.', [
|
||||
'issue_id' => ['type' => 'integer'],
|
||||
@@ -180,28 +229,28 @@ final class McpDispatcher
|
||||
|
||||
switch ($name) {
|
||||
case 'redmine_list_projects':
|
||||
$result = $this->redmine->listProjects($this->objectArg($arguments, 'params'));
|
||||
$result = $this->redmine->listProjects(ListQueryNormalizer::listParams($arguments));
|
||||
break;
|
||||
case 'redmine_get_project':
|
||||
$result = $this->redmine->project($this->projectIdArg($arguments, 'project_id'), $this->objectArg($arguments, 'params'));
|
||||
break;
|
||||
case 'redmine_list_project_memberships':
|
||||
$result = $this->redmine->projectMemberships($this->projectIdArg($arguments, 'project_id'), $this->objectArg($arguments, 'params'));
|
||||
$result = $this->redmine->projectMemberships($this->projectIdArg($arguments, 'project_id'), ListQueryNormalizer::listParams($arguments));
|
||||
break;
|
||||
case 'redmine_list_users':
|
||||
$result = $this->redmine->listUsers($this->objectArg($arguments, 'params'));
|
||||
$result = $this->redmine->listUsers(ListQueryNormalizer::userParams($arguments));
|
||||
break;
|
||||
case 'redmine_get_user':
|
||||
$result = $this->redmine->user($this->intArg($arguments, 'user_id'), $this->objectArg($arguments, 'params'));
|
||||
break;
|
||||
case 'redmine_list_issues':
|
||||
$result = $this->redmine->filterIssues($this->objectArg($arguments, 'filters'));
|
||||
$result = $this->redmine->filterIssues(ListQueryNormalizer::issueFilters($arguments));
|
||||
break;
|
||||
case 'redmine_search':
|
||||
$result = $this->redmine->search($this->stringArg($arguments, 'query'), $this->objectArg($arguments, 'params'));
|
||||
$result = $this->redmine->search($this->stringArg($arguments, 'query'), ListQueryNormalizer::searchParams($arguments));
|
||||
break;
|
||||
case 'redmine_search_issues':
|
||||
$result = $this->redmine->searchIssues($this->stringArg($arguments, 'query'), $this->objectArg($arguments, 'params'));
|
||||
$result = $this->redmine->searchIssues($this->stringArg($arguments, 'query'), ListQueryNormalizer::searchParams($arguments));
|
||||
break;
|
||||
case 'redmine_get_issue':
|
||||
$result = $this->redmine->issue($this->intArg($arguments, 'issue_id'), $this->stringListArg($arguments, 'include', ['journals', 'attachments']));
|
||||
|
||||
Reference in New Issue
Block a user