{"record":{"id":"c6208539364d7634","repo":"abhigyanpatwari/GitNexus","slug":"unknown-group-tool-method-removed-tools-use","errorCode":null,"errorMessage":"Unknown group tool: ${method}. Removed tools: use repo \"@<groupName>\" on impact, query, or context (optional \"/<memberPath>\"), or MCP resources.","messagePattern":"Unknown group tool: (.+?)\\. Removed tools: use repo \"@<groupName>\" on impact, query, or context \\(optional \"/<memberPath>\"\\), or MCP resources\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gitnexus/src/mcp/local/local-backend.ts","lineNumber":8202,"sourceCode":"        // Group cross-repo fan-out consumes only byDepth (cross-impact.ts), not\n        // the #1858 epistemic/boundaries fields — computing them per neighbor is\n        // dead work on the highest-volume path, so suppress them here too.\n        skipEpistemic: true,\n        hasExplicitRelationTypes: opts.relationTypes.length > 0,\n      });\n    } catch {\n      return null;\n    }\n  }\n\n  private handleGroupTool(method: string, params: Record<string, unknown>): Promise<unknown> {\n    switch (method) {\n      case 'group_list':\n        return this.groupList(params);\n      case 'group_sync':\n        return this.groupSync(params);\n      default:\n        throw new Error(\n          `Unknown group tool: ${method}. Removed tools: use repo \"@<groupName>\" on impact, query, or context (optional \"/<memberPath>\"), or MCP resources.`,\n        );\n    }\n  }\n\n  /**\n   * Dispatch impact/query/context when `repo` is `@groupName` or `@groupName/memberPath`\n   * (group mode — not the global indexed-repo `repo` parameter).\n   */\n  private async callToolAtGroupRepo(\n    method: string,\n    params: Record<string, unknown>,\n  ): Promise<unknown> {\n    await this.refreshRepos();\n\n    if (\n      params.service !== undefined &&\n      params.service !== null &&","sourceCodeStart":8184,"sourceCodeEnd":8220,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/0d1aed942f0e8b5d3bac27519fff441aceea722d/gitnexus/src/mcp/local/local-backend.ts#L8184-L8220","documentation":"handleGroupTool only recognizes group_list and group_sync; anything else in the group namespace throws, and since v1.5.0 removed group_query/group_contracts/group_status, the message actively redirects: use repo \"@<groupName>\" (optionally \"/<memberPath>\") on impact, query, or context, or the gitnexus://group/{name} MCP resources.","triggerScenarios":"An MCP client or agent prompt calling the removed tools group_query/group_contracts/group_status, or any misspelled group_* method — the group dispatch switch has exactly two valid cases.","commonSituations":"Configs and tutorials written against pre-1.5.0 GitNexus; AI agents replaying tool names learned from older docs; clients that never migrated to the repo \"@group\" parameter form after the cross-repo #794 rework.","solutions":["Replace group_query with impact/query/context using repo \"@<groupName>\" (append \"/<memberPath>\" to scope to one member).","Use the MCP resources gitnexus://group/{name}/contracts and gitnexus://group/{name}/status instead of group_contracts/group_status.","Keep group_list and group_sync — they still exist and are the only valid group tools.","Search your client configs/agent instructions for 'group_query', 'group_contracts', 'group_status' and migrate every occurrence."],"exampleFix":"# before: removed group tools\n{\"tool\": \"group_query\", \"args\": {\"group\": \"mygroup\", \"search_query\": \"retry\"}}\n{\"tool\": \"group_status\", \"args\": {\"group\": \"mygroup\"}}\n\n# after: repo \"@group\" parameter + MCP resources\n{\"tool\": \"query\", \"args\": {\"search_query\": \"retry\", \"repo\": \"@mygroup\"}}\n{\"tool\": \"impact\", \"args\": {\"target\": \"login\", \"repo\": \"@mygroup/packages/api\"}}\n# status/contracts: read resource gitnexus://group/mygroup/status","handlingStrategy":"validation","validationCode":"// Migrate group calls to the post-1.5.0 surface before dispatch\nconst REMOVED_GROUP_TOOLS = new Set(['group_query', 'group_contracts', 'group_status']);\nconst VALID_GROUP_TOOLS = new Set(['group_list', 'group_sync']);\n\nfunction normalizeGroupCall(method: string, params: Record<string, unknown>) {\n  if (REMOVED_GROUP_TOOLS.has(method)) {\n    const group = params.group ?? params.name;\n    if (method === 'group_query') return { method: 'query', args: { ...params, repo: `@${group}` } };\n    return { method: 'resource', args: { uri: `gitnexus://group/${group}/${method === 'group_status' ? 'status' : 'contracts'}` } };\n  }\n  if (method.startsWith('group_') && !VALID_GROUP_TOOLS.has(method)) {\n    throw new Error(`Unknown group tool \"${method}\" — valid: ${[...VALID_GROUP_TOOLS].join(', ')}`);\n  }\n  return { method, args: params };\n}","typeGuard":"const isGroupToolCall = (m: string): m is 'group_list' | 'group_sync' =>\n  m === 'group_list' || m === 'group_sync';","tryCatchPattern":"try {\n  return await backend.callTool(method, params);\n} catch (err) {\n  if (err instanceof Error && err.message.startsWith('Unknown group tool:')) {\n    // migrate the call instead of surfacing it: group_query → repo \"@group\", status → resource\n    const migrated = normalizeGroupCall(method, params);\n    return migrated.method === 'resource'\n      ? client.readResource(migrated.args.uri)\n      : backend.callTool(migrated.method, migrated.args);\n  }\n  throw err;\n}","preventionTips":["Search configs and agent prompts for group_query/group_contracts/group_status and migrate them.","Use repo \"@<groupName>\" (optionally \"/<memberPath>\") on impact/query/context for group scopes.","Read group status/contracts from the gitnexus://group/{name}/* MCP resources.","After any gitnexus upgrade, diff the advertised tools/list against your call sites."],"tags":["mcp","group-tools","removed-api","migration","version-skew"],"backgroundTag":"removed-tool-migration","analyzedSha":"0d1aed942f0e8b5d3bac27519fff441aceea722d","analyzedAt":"2026-08-20T23:29:22.980Z","contentChangedAt":"2026-08-20T23:29:22.980Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}