@selfagency/git-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/constants.ts","../src/resources/git.resources.ts","../src/git/client.ts","../src/services/branch.service.ts","../src/services/inspect.service.ts","../src/tools/advanced.tools.ts","../src/schemas/index.ts","../src/services/advanced.service.ts","../src/tools/branch.tools.ts","../src/tools/context.tools.ts","../src/services/context.service.ts","../src/tools/docs.tools.ts","../src/services/docs.service.ts","../src/tools/flow.tools.ts","../src/services/flow.service.ts","../src/tools/inspect.tools.ts","../src/tools/lfs.tools.ts","../src/services/lfs.service.ts","../src/tools/remote.tools.ts","../src/services/remote.service.ts","../src/tools/write.tools.ts","../src/services/write.service.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport {\n ALLOW_FORCE_PUSH,\n ALLOW_NO_VERIFY,\n AUTO_SIGN_COMMITS,\n AUTO_SIGN_TAGS,\n DEFAULT_REPO_PATH,\n DEFAULT_SIGNING_KEY,\n} from './config.js';\nimport { SERVER_NAME, SERVER_VERSION } from './constants.js';\nimport { registerGitResources } from './resources/git.resources.js';\nimport { registerAdvancedTools } from './tools/advanced.tools.js';\nimport { registerBranchTools } from './tools/branch.tools.js';\nimport { registerContextTools } from './tools/context.tools.js';\nimport { registerDocsTools } from './tools/docs.tools.js';\nimport { registerFlowTools } from './tools/flow.tools.js';\nimport { registerInspectTools } from './tools/inspect.tools.js';\nimport { registerLfsTools } from './tools/lfs.tools.js';\nimport { registerRemoteTools } from './tools/remote.tools.js';\nimport { registerWriteTools } from './tools/write.tools.js';\n\nconst server = new McpServer({\n name: SERVER_NAME,\n version: SERVER_VERSION,\n});\n\nregisterInspectTools(server);\nregisterWriteTools(server);\nregisterBranchTools(server);\nregisterRemoteTools(server);\nregisterAdvancedTools(server);\nregisterContextTools(server);\nregisterLfsTools(server);\nregisterFlowTools(server);\nregisterDocsTools(server);\nregisterGitResources(server);\n\nserver.registerTool(\n 'git_ping',\n {\n title: 'Git MCP Ping',\n description: 'Returns a simple response to verify the server is running.',\n inputSchema: {\n message: z.string().default('pong'),\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({ message }: { message: string }) => {\n return {\n content: [{ type: 'text', text: `git-mcp-server: ${message}` }],\n structuredContent: {\n ok: true,\n message,\n },\n };\n },\n);\n\nasync function main(): Promise<void> {\n if (DEFAULT_REPO_PATH) {\n console.error(`[git-mcp] default repository path: ${DEFAULT_REPO_PATH}`);\n }\n if (ALLOW_NO_VERIFY) console.error('[git-mcp] hook bypass enabled (GIT_ALLOW_NO_VERIFY=true)');\n if (ALLOW_FORCE_PUSH) console.error('[git-mcp] force push enabled (GIT_ALLOW_FORCE_PUSH=true)');\n if (AUTO_SIGN_COMMITS) console.error('[git-mcp] auto-signing commits (GIT_AUTO_SIGN_COMMITS=true)');\n if (AUTO_SIGN_TAGS) console.error('[git-mcp] auto-signing tags (GIT_AUTO_SIGN_TAGS=true)');\n if (DEFAULT_SIGNING_KEY) console.error(`[git-mcp] signing key: ${DEFAULT_SIGNING_KEY}`);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Server startup failed: ${message}`);\n process.exit(1);\n});\n","import path from 'node:path';\n\n/**\n * Parses --repo or --repo-path from process.argv.\n * Supports both `--repo-path /path` and `--repo-path=/path` forms.\n */\nfunction parseCliRepoPath(): string | undefined {\n const args = process.argv.slice(2);\n for (let i = 0; i < args.length; i++) {\n const arg = args[i] ?? '';\n if ((arg === '--repo' || arg === '--repo-path') && i + 1 < args.length) {\n return args[i + 1];\n }\n const match = /^--repo(?:-path)?=(.+)$/.exec(arg);\n if (match?.[1]) return match[1];\n }\n return undefined;\n}\n\nconst configured: string | undefined = process.env['GIT_REPO_PATH'] ?? parseCliRepoPath();\n\n/**\n * Server-level default repository path, resolved to an absolute path.\n * Set via the GIT_REPO_PATH environment variable or --repo / --repo-path CLI argument.\n */\nexport const DEFAULT_REPO_PATH: string | undefined = configured ? path.resolve(configured) : undefined;\n\n/**\n * Resolves the effective repository path for a tool request.\n * Uses the provided path if given, otherwise falls back to the server default.\n * Throws a clear error if neither is available.\n */\nexport function resolveRepoPath(repoPath: string | undefined): string {\n const resolved = repoPath ?? DEFAULT_REPO_PATH;\n if (!resolved) {\n throw new Error(\n 'No repository path provided. Pass repo_path in the tool request, ' +\n 'or configure a server default via the GIT_REPO_PATH environment variable ' +\n 'or the --repo / --repo-path CLI argument.',\n );\n }\n return resolved;\n}\n\n// ---------------------------------------------------------------------------\n// Hook bypass\n// ---------------------------------------------------------------------------\n\n/**\n * When true, tools accept a `no_verify` parameter that passes --no-verify to\n * git commit and git push, bypassing pre-commit / pre-push hooks.\n * Enable via: GIT_ALLOW_NO_VERIFY=true\n */\nexport const ALLOW_NO_VERIFY: boolean = process.env['GIT_ALLOW_NO_VERIFY'] === 'true';\n\n// ---------------------------------------------------------------------------\n// Force push\n// ---------------------------------------------------------------------------\n\n/**\n * When true, tools accept a `force` parameter that passes --force to git push.\n * Note: this bypasses local safety checks only. Remote branch protection\n * (e.g. GitHub/GitLab protected branches) is enforced server-side regardless.\n * Enable via: GIT_ALLOW_FORCE_PUSH=true\n */\nexport const ALLOW_FORCE_PUSH: boolean = process.env['GIT_ALLOW_FORCE_PUSH'] === 'true';\n\n// ---------------------------------------------------------------------------\n// Commit / tag signing\n// ---------------------------------------------------------------------------\n\n/**\n * Default signing key (GPG key ID, SSH public key path, or empty to use git's\n * configured user.signingkey). Set via: GIT_SIGNING_KEY=<value>\n */\nexport const DEFAULT_SIGNING_KEY: string | undefined = process.env['GIT_SIGNING_KEY'] || undefined;\n\n/**\n * Signing format: openpgp | ssh | x509\n * Set via: GIT_SIGNING_FORMAT=ssh\n */\nexport const DEFAULT_SIGNING_FORMAT: string | undefined = process.env['GIT_SIGNING_FORMAT'] || undefined;\n\n/**\n * Auto-sign all commits produced by this server.\n * Enable via: GIT_AUTO_SIGN_COMMITS=true\n */\nexport const AUTO_SIGN_COMMITS: boolean = process.env['GIT_AUTO_SIGN_COMMITS'] === 'true';\n\n/**\n * Auto-sign all tags produced by this server.\n * Enable via: GIT_AUTO_SIGN_TAGS=true\n */\nexport const AUTO_SIGN_TAGS: boolean = process.env['GIT_AUTO_SIGN_TAGS'] === 'true';\n","export const SERVER_NAME = 'git-mcp-server';\nexport const SERVER_VERSION = '0.1.0';\nexport const CHARACTER_LIMIT = 25_000;\n\nexport const EXCLUDED_DIFF_DIRECTORIES = ['node_modules/', '.yarn/', '.astro/', 'dist/'] as const;\n\nexport const EXCLUDED_DIFF_EXTENSIONS = [\n 'png',\n 'jpg',\n 'jpeg',\n 'gif',\n 'svg',\n 'ico',\n 'webp',\n 'bmp',\n 'tiff',\n 'mp4',\n 'mp3',\n 'wav',\n 'ogg',\n 'pdf',\n 'woff',\n 'woff2',\n 'ttf',\n 'eot',\n 'zip',\n 'tar',\n 'gz',\n] as const;\n","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { listBranches } from '../services/branch.service.js';\nimport { getDiff, getLog, getStatus } from '../services/inspect.service.js';\n\nfunction decodeRepoPath(value: string): string {\n return decodeURIComponent(value);\n}\n\nfunction stringify(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n\nexport function registerGitResources(server: McpServer): void {\n const templateConfig = { list: undefined };\n\n server.registerResource(\n 'git_repo_status',\n new ResourceTemplate('git+repo://status/{repo_path}', templateConfig),\n {\n title: 'Git Repository Status',\n description: 'Read-only repository status snapshot.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const status = await getStatus(repoPath);\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify(status) }],\n };\n },\n );\n\n server.registerResource(\n 'git_repo_log',\n new ResourceTemplate('git+repo://log/{repo_path}', templateConfig),\n {\n title: 'Git Repository Log',\n description: 'Read-only recent commit log.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const commits = await getLog(repoPath, { limit: 20, offset: 0 });\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify({ commits }) }],\n };\n },\n );\n\n server.registerResource(\n 'git_repo_branches',\n new ResourceTemplate('git+repo://branches/{repo_path}', templateConfig),\n {\n title: 'Git Repository Branches',\n description: 'Read-only branch list.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const branches = await listBranches(repoPath, true);\n return {\n contents: [{ uri: uri.toString(), mimeType: 'application/json', text: stringify({ branches }) }],\n };\n },\n );\n\n server.registerResource(\n 'git_repo_diff',\n new ResourceTemplate('git+repo://diff/{repo_path}', templateConfig),\n {\n title: 'Git Repository Diff',\n description: 'Read-only unstaged + staged diff views.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const repoPath = decodeRepoPath(String(variables.repo_path ?? ''));\n const [unstaged, staged] = await Promise.all([\n getDiff(repoPath, { mode: 'unstaged', filtered: false }),\n getDiff(repoPath, { mode: 'staged', filtered: false }),\n ]);\n\n return {\n contents: [\n {\n uri: uri.toString(),\n mimeType: 'application/json',\n text: stringify({ unstaged, staged }),\n },\n ],\n };\n },\n );\n}\n","import { existsSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { simpleGit, type SimpleGit } from 'simple-git';\nimport type { GitError, GitErrorKind } from '../types.js';\n\nconst GIT_NOT_FOUND_PATTERN = /(not found|is not recognized|ENOENT)/i;\nconst PERMISSION_PATTERN = /(permission denied|EACCES|EPERM)/i;\nconst CONFLICT_PATTERN = /(CONFLICT|merge conflict|rebase in progress|cherry-pick in progress)/i;\nconst NETWORK_PATTERN = /(network|timed out|unable to access|could not resolve host|proxy)/i;\n\nfunction classifyError(message: string): GitErrorKind {\n if (GIT_NOT_FOUND_PATTERN.test(message)) {\n return 'missing_git';\n }\n\n if (PERMISSION_PATTERN.test(message)) {\n return 'permission';\n }\n\n if (CONFLICT_PATTERN.test(message)) {\n return 'git_conflict';\n }\n\n if (NETWORK_PATTERN.test(message)) {\n return 'network';\n }\n\n return 'unknown';\n}\n\nexport function toGitError(error: unknown): GitError {\n if (error instanceof Error) {\n return {\n kind: classifyError(error.message),\n message: error.message,\n };\n }\n\n return {\n kind: 'unknown',\n message: String(error),\n };\n}\n\nexport function validateRepoPath(repoPath: string): string {\n const resolved = path.resolve(repoPath);\n\n if (!existsSync(resolved)) {\n throw new Error(`Repository path does not exist: ${repoPath}`);\n }\n\n if (!statSync(resolved).isDirectory()) {\n throw new Error(`Repository path is not a directory: ${repoPath}`);\n }\n\n return resolved;\n}\n\nexport function getGit(repoPath: string): SimpleGit {\n const safePath = validateRepoPath(repoPath);\n return simpleGit({ baseDir: safePath, binary: 'git', maxConcurrentProcesses: 6 });\n}\n","import { getGit } from '../git/client.js';\nimport type { BranchInfo } from '../types.js';\n\nexport interface CreateBranchOptions {\n readonly name: string;\n readonly fromRef?: string;\n readonly checkout: boolean;\n}\n\nexport interface DeleteBranchOptions {\n readonly name: string;\n readonly force: boolean;\n}\n\nexport async function listBranches(repoPath: string, all: boolean): Promise<BranchInfo[]> {\n const git = getGit(repoPath);\n const summary = await git.branch(all ? ['-a'] : []);\n\n return summary.all.map(name => {\n const details = Object.hasOwn(summary.branches, name) ? summary.branches[name] : undefined;\n return {\n name,\n isCurrent: summary.current === name,\n commit: details?.commit,\n upstream: details?.label,\n };\n });\n}\n\nexport async function createBranch(repoPath: string, options: CreateBranchOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.fromRef) {\n if (options.checkout) {\n await git.checkoutBranch(options.name, options.fromRef);\n } else {\n await git.raw(['branch', options.name, options.fromRef]);\n }\n return options.checkout\n ? `Created and checked out ${options.name} from ${options.fromRef}.`\n : `Created branch ${options.name} from ${options.fromRef}.`;\n }\n\n await git.branch([options.name]);\n if (options.checkout) {\n await git.checkout(options.name);\n }\n\n return options.checkout ? `Created and checked out ${options.name}.` : `Created branch ${options.name}.`;\n}\n\nexport async function deleteBranch(repoPath: string, options: DeleteBranchOptions): Promise<string> {\n const git = getGit(repoPath);\n await git.deleteLocalBranch(options.name, options.force);\n return `Deleted branch ${options.name}.`;\n}\n\nexport async function renameBranch(repoPath: string, oldName: string, newName: string): Promise<string> {\n const git = getGit(repoPath);\n await git.branch(['-m', oldName, newName]);\n return `Renamed branch ${oldName} to ${newName}.`;\n}\n\nexport async function checkoutRef(repoPath: string, ref: string, create: boolean): Promise<string> {\n const git = getGit(repoPath);\n\n if (create) {\n await git.checkoutLocalBranch(ref);\n return `Created and checked out ${ref}.`;\n }\n\n await git.checkout(ref);\n return `Checked out ${ref}.`;\n}\n\nexport async function setUpstream(repoPath: string, branch: string, upstream: string): Promise<string> {\n const git = getGit(repoPath);\n await git.raw(['branch', '--set-upstream-to', upstream, branch]);\n return `Set upstream of ${branch} to ${upstream}.`;\n}\n","import path from 'node:path';\nimport { CHARACTER_LIMIT, EXCLUDED_DIFF_DIRECTORIES, EXCLUDED_DIFF_EXTENSIONS } from '../constants.js';\nimport { getGit } from '../git/client.js';\nimport type { CommitInfo, DiffSummary, FileStatus } from '../types.js';\n\nexport interface GitStatusResult {\n readonly branch: string;\n readonly current: string;\n readonly tracking: string;\n readonly ahead: number;\n readonly behind: number;\n readonly files: FileStatus[];\n readonly isClean: boolean;\n}\n\nexport interface GitLogOptions {\n readonly limit: number;\n readonly offset: number;\n readonly author?: string;\n readonly grep?: string;\n readonly since?: string;\n readonly until?: string;\n readonly filePath?: string;\n}\n\nexport interface GitDiffOptions {\n readonly mode: 'unstaged' | 'staged' | 'refs';\n readonly fromRef?: string;\n readonly toRef?: string;\n readonly filtered: boolean;\n}\n\nfunction truncate(text: string): string {\n if (text.length <= CHARACTER_LIMIT) {\n return text;\n }\n\n return `${text.slice(0, CHARACTER_LIMIT)}\\n\\n[truncated to ${CHARACTER_LIMIT} characters]`;\n}\n\nfunction parseLogLine(line: string): CommitInfo | null {\n const [hash, authorName, authorEmail, dateIso, ...subjectParts] = line.split('\\t');\n if (!hash || !authorName || !authorEmail || !dateIso) {\n return null;\n }\n\n return {\n hash,\n authorName,\n authorEmail,\n dateIso,\n subject: subjectParts.join('\\t'),\n };\n}\n\nfunction shouldExcludeFile(filePath: string): boolean {\n if (EXCLUDED_DIFF_DIRECTORIES.some(prefix => filePath.startsWith(prefix))) {\n return true;\n }\n\n const extension = path.extname(filePath).replace(/^\\./, '').toLowerCase();\n if (!extension) {\n return false;\n }\n\n return EXCLUDED_DIFF_EXTENSIONS.includes(extension as (typeof EXCLUDED_DIFF_EXTENSIONS)[number]);\n}\n\nfunction buildDiffBaseArgs(options: GitDiffOptions): string[] {\n if (options.mode === 'staged') {\n return ['diff', '--staged'];\n }\n\n if (options.mode === 'refs') {\n if (!options.fromRef || !options.toRef) {\n throw new Error(\"from_ref and to_ref are required when mode='refs'\");\n }\n\n return ['diff', `${options.fromRef}..${options.toRef}`];\n }\n\n return ['diff'];\n}\n\nexport async function getStatus(repoPath: string): Promise<GitStatusResult> {\n const git = getGit(repoPath);\n const status = await git.status();\n\n const files: FileStatus[] = status.files.map(file => ({\n path: file.path,\n index: file.index,\n workingTree: file.working_dir,\n }));\n\n return {\n branch: status.current ?? '',\n current: status.current ?? '',\n tracking: status.tracking ?? '',\n ahead: status.ahead,\n behind: status.behind,\n files,\n isClean: status.isClean(),\n };\n}\n\nexport async function getLog(repoPath: string, options: GitLogOptions): Promise<CommitInfo[]> {\n const git = getGit(repoPath);\n\n const args = [\n 'log',\n '--date=iso-strict',\n `--skip=${options.offset}`,\n '-n',\n String(options.limit),\n '--pretty=format:%H%x09%an%x09%ae%x09%aI%x09%s',\n ];\n\n if (options.author) {\n args.push(`--author=${options.author}`);\n }\n\n if (options.grep) {\n args.push(`--grep=${options.grep}`);\n }\n\n if (options.since) {\n args.push(`--since=${options.since}`);\n }\n\n if (options.until) {\n args.push(`--until=${options.until}`);\n }\n\n if (options.filePath) {\n args.push('--', options.filePath);\n }\n\n const output = await git.raw(args);\n\n return output\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .map(parseLogLine)\n .filter((item): item is CommitInfo => item !== null);\n}\n\nexport async function showRef(repoPath: string, ref: string): Promise<string> {\n const git = getGit(repoPath);\n const output = await git.raw(['show', '--stat', '--patch', ref]);\n return truncate(output);\n}\n\nexport async function getDiffSummary(repoPath: string, options: GitDiffOptions): Promise<DiffSummary> {\n const git = getGit(repoPath);\n const baseArgs = buildDiffBaseArgs(options).slice(1);\n const summary = await git.diffSummary(baseArgs);\n\n return {\n filesChanged: summary.files.length,\n insertions: summary.insertions,\n deletions: summary.deletions,\n };\n}\n\nexport async function getDiff(repoPath: string, options: GitDiffOptions): Promise<string> {\n const git = getGit(repoPath);\n const baseArgs = buildDiffBaseArgs(options);\n\n if (!options.filtered) {\n const output = await git.raw(baseArgs);\n return truncate(output);\n }\n\n const namesOutput = await git.raw([...baseArgs, '--name-only']);\n const files = namesOutput\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0)\n .filter(line => !shouldExcludeFile(line));\n\n if (files.length === 0) {\n return 'No changed files after filtering.';\n }\n\n const chunks: string[] = [];\n for (const filePath of files) {\n const diff = await git.raw([...baseArgs, '--', filePath]);\n chunks.push(`=== ${filePath} ===\\n${diff.trim()}`);\n }\n\n return truncate(chunks.join('\\n\\n'));\n}\n\nexport async function blameFile(repoPath: string, filePath: string, ref?: string): Promise<string> {\n const git = getGit(repoPath);\n\n const args = ['blame'];\n if (ref) {\n args.push(ref);\n }\n args.push('--', filePath);\n\n const output = await git.raw(args);\n return truncate(output);\n}\n\nexport async function getReflog(repoPath: string, limit: number): Promise<string> {\n const git = getGit(repoPath);\n const output = await git.raw(['reflog', '--date=iso', '-n', String(limit)]);\n return truncate(output);\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport {\n runBisectAction,\n runCherryPickAction,\n runRebaseAction,\n runStashAction,\n runSubmoduleAction,\n runTagAction,\n runWorktreeAction,\n} from '../services/advanced.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nfunction buildError(error: unknown): { content: Array<{ type: 'text'; text: string }> } {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n}\n\nexport function registerAdvancedTools(server: McpServer): void {\n server.registerTool(\n 'git_stash',\n {\n title: 'Git Stash Actions',\n description: 'Save, list, apply, pop, or drop stash entries.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['save', 'list', 'apply', 'pop', 'drop']),\n message: z.string().optional(),\n index: z.number().int().min(0).optional(),\n include_untracked: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n message,\n index,\n include_untracked,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'save' | 'list' | 'apply' | 'pop' | 'drop';\n message?: string;\n index?: number;\n include_untracked: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runStashAction(repoPath, {\n action,\n message,\n index,\n includeUntracked: include_untracked,\n });\n\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_rebase',\n {\n title: 'Git Rebase Actions',\n description: 'Start, continue, skip, or abort rebase operations.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['start', 'continue', 'abort', 'skip']),\n onto: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n onto,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'start' | 'continue' | 'abort' | 'skip';\n onto?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runRebaseAction(repoPath, { action, onto });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_cherry_pick',\n {\n title: 'Git Cherry-pick Actions',\n description: 'Start, continue, or abort cherry-pick.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['start', 'continue', 'abort']),\n ref: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n ref,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'start' | 'continue' | 'abort';\n ref?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runCherryPickAction(repoPath, { action, ref });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_bisect',\n {\n title: 'Git Bisect Actions',\n description: 'Run bisect workflows for bug isolation.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['start', 'good', 'bad', 'skip', 'run', 'reset']),\n ref: z.string().optional(),\n good_ref: z.string().optional(),\n bad_ref: z.string().optional(),\n command: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n ref,\n good_ref,\n bad_ref,\n command,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'start' | 'good' | 'bad' | 'skip' | 'run' | 'reset';\n ref?: string;\n good_ref?: string;\n bad_ref?: string;\n command?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runBisectAction(repoPath, {\n action,\n ref,\n goodRef: good_ref,\n badRef: bad_ref,\n command,\n });\n\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_tag',\n {\n title: 'Git Tag Actions',\n description: 'List, create, or delete tags. Supports GPG/SSH signed tags.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['list', 'create', 'delete']),\n name: z.string().optional(),\n target: z.string().optional(),\n message: z.string().optional(),\n sign: z\n .boolean()\n .default(false)\n .describe('Create a signed tag (-s/-u). Defaults to server AUTO_SIGN_TAGS setting.'),\n signing_key: z\n .string()\n .optional()\n .describe('Specific signing key ID or path. Falls back to GIT_SIGNING_KEY env var.'),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n name,\n target,\n message,\n sign,\n signing_key,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'list' | 'create' | 'delete';\n name?: string;\n target?: string;\n message?: string;\n sign: boolean;\n signing_key?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runTagAction(repoPath, {\n action,\n name,\n target,\n message,\n sign,\n signingKey: signing_key,\n });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_worktree',\n {\n title: 'Git Worktree Actions',\n description: 'Add, list, or remove worktrees.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['add', 'list', 'remove']),\n path: z.string().optional(),\n branch: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n path,\n branch,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'add' | 'list' | 'remove';\n path?: string;\n branch?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runWorktreeAction(repoPath, { action, path, branch });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_submodule',\n {\n title: 'Git Submodule Actions',\n description: 'Add, list, update, or sync submodules.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['add', 'list', 'update', 'sync']),\n url: z.string().optional(),\n path: z.string().optional(),\n recursive: z.boolean().default(true),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n url,\n path,\n recursive,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'add' | 'list' | 'update' | 'sync';\n url?: string;\n path?: string;\n recursive: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runSubmoduleAction(repoPath, {\n action,\n url,\n path,\n recursive,\n });\n\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n}\n","import { z } from 'zod';\n\nexport const RepoPathSchema = z\n .string()\n .min(1)\n .optional()\n .describe(\n 'Absolute path to the local Git repository. ' +\n 'If omitted, falls back to the server default set via the GIT_REPO_PATH environment variable or --repo-path CLI argument.',\n );\n\nexport const RefSchema = z\n .string()\n .min(1, 'ref is required')\n .describe('Git reference: branch, tag, commit SHA, or HEAD expression.');\n\nexport const PaginationSchema = z\n .object({\n limit: z.number().int().min(1).max(200).default(50),\n offset: z.number().int().min(0).default(0),\n })\n .strict();\n\nexport const ConfirmSchema = z.boolean().default(false);\n\nexport const ResponseFormatSchema = z\n .enum(['markdown', 'json'])\n .default('markdown')\n .describe('Output format for the response.');\n","import { AUTO_SIGN_TAGS, DEFAULT_SIGNING_KEY } from '../config.js';\nimport { getGit } from '../git/client.js';\n\nexport interface StashActionOptions {\n readonly action: 'save' | 'list' | 'apply' | 'pop' | 'drop';\n readonly message?: string;\n readonly index?: number;\n readonly includeUntracked?: boolean;\n}\n\nexport interface RebaseActionOptions {\n readonly action: 'start' | 'continue' | 'abort' | 'skip';\n readonly onto?: string;\n}\n\nexport interface CherryPickActionOptions {\n readonly action: 'start' | 'continue' | 'abort';\n readonly ref?: string;\n}\n\nexport interface BisectActionOptions {\n readonly action: 'start' | 'good' | 'bad' | 'skip' | 'run' | 'reset';\n readonly ref?: string;\n readonly goodRef?: string;\n readonly badRef?: string;\n readonly command?: string;\n}\n\nexport interface TagActionOptions {\n readonly action: 'list' | 'create' | 'delete';\n readonly name?: string;\n readonly target?: string;\n readonly message?: string;\n /** Sign the tag. Defaults to AUTO_SIGN_TAGS server config. */\n readonly sign?: boolean;\n /** Signing key to use. Falls back to DEFAULT_SIGNING_KEY, then git's user.signingkey. */\n readonly signingKey?: string;\n}\n\nexport interface WorktreeActionOptions {\n readonly action: 'add' | 'list' | 'remove';\n readonly path?: string;\n readonly branch?: string;\n}\n\nexport interface SubmoduleActionOptions {\n readonly action: 'add' | 'list' | 'update' | 'sync';\n readonly url?: string;\n readonly path?: string;\n readonly recursive?: boolean;\n}\n\nexport async function runStashAction(repoPath: string, options: StashActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'save') {\n const args = ['stash', 'push'];\n if (options.includeUntracked) {\n args.push('--include-untracked');\n }\n if (options.message) {\n args.push('-m', options.message);\n }\n const output = await git.raw(args);\n return output.trim() || 'Stash saved.';\n }\n\n if (options.action === 'list') {\n const output = await git.raw(['stash', 'list']);\n return output.trim() || 'No stashes.';\n }\n\n const index = options.index ?? 0;\n if (options.action === 'apply') {\n const output = await git.raw(['stash', 'apply', `stash@{${index}}`]);\n return output.trim() || `Applied stash@{${index}}.`;\n }\n\n if (options.action === 'pop') {\n const output = await git.raw(['stash', 'pop', `stash@{${index}}`]);\n return output.trim() || `Popped stash@{${index}}.`;\n }\n\n const output = await git.raw(['stash', 'drop', `stash@{${index}}`]);\n return output.trim() || `Dropped stash@{${index}}.`;\n}\n\nexport async function runRebaseAction(repoPath: string, options: RebaseActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'continue') {\n const output = await git.raw(['rebase', '--continue']);\n return output.trim() || 'Rebase continued.';\n }\n\n if (options.action === 'abort') {\n const output = await git.raw(['rebase', '--abort']);\n return output.trim() || 'Rebase aborted.';\n }\n\n if (options.action === 'skip') {\n const output = await git.raw(['rebase', '--skip']);\n return output.trim() || 'Rebase skipped current commit.';\n }\n\n if (!options.onto) {\n throw new Error('onto is required for rebase start.');\n }\n\n const output = await git.raw(['rebase', options.onto]);\n return output.trim() || `Rebase started onto ${options.onto}.`;\n}\n\nexport async function runCherryPickAction(repoPath: string, options: CherryPickActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'continue') {\n const output = await git.raw(['cherry-pick', '--continue']);\n return output.trim() || 'Cherry-pick continued.';\n }\n\n if (options.action === 'abort') {\n const output = await git.raw(['cherry-pick', '--abort']);\n return output.trim() || 'Cherry-pick aborted.';\n }\n\n if (!options.ref) {\n throw new Error('ref is required when cherry-pick action is start.');\n }\n\n const output = await git.raw(['cherry-pick', options.ref]);\n return output.trim() || `Cherry-picked ${options.ref}.`;\n}\n\nexport async function runBisectAction(repoPath: string, options: BisectActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n switch (options.action) {\n case 'start': {\n if (!options.badRef || !options.goodRef) {\n throw new Error('goodRef and badRef are required for bisect start.');\n }\n await git.raw(['bisect', 'start']);\n await git.raw(['bisect', 'bad', options.badRef]);\n await git.raw(['bisect', 'good', options.goodRef]);\n return `Bisect started between good=${options.goodRef} and bad=${options.badRef}.`;\n }\n case 'good': {\n const output = await git.raw(['bisect', 'good', ...(options.ref ? [options.ref] : [])]);\n return output.trim() || 'Marked current commit as good.';\n }\n case 'bad': {\n const output = await git.raw(['bisect', 'bad', ...(options.ref ? [options.ref] : [])]);\n return output.trim() || 'Marked current commit as bad.';\n }\n case 'skip': {\n const output = await git.raw(['bisect', 'skip', ...(options.ref ? [options.ref] : [])]);\n return output.trim() || 'Skipped current bisect commit.';\n }\n case 'run': {\n if (!options.command) {\n throw new Error('command is required for bisect run.');\n }\n const output = await git.raw(['bisect', 'run', 'sh', '-lc', options.command]);\n return output.trim() || 'Bisect run completed.';\n }\n case 'reset': {\n const output = await git.raw(['bisect', 'reset']);\n return output.trim() || 'Bisect reset.';\n }\n }\n}\n\nexport async function runTagAction(repoPath: string, options: TagActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'list') {\n const output = await git.tags();\n return output.all.join('\\n') || 'No tags.';\n }\n\n if (options.action === 'delete') {\n if (!options.name) {\n throw new Error('name is required for delete action.');\n }\n await git.tag(['-d', options.name]);\n return `Deleted tag ${options.name}.`;\n }\n\n if (!options.name) {\n throw new Error('name is required for create action.');\n }\n\n const shouldSign = options.sign ?? AUTO_SIGN_TAGS;\n\n if (shouldSign) {\n const key = options.signingKey ?? DEFAULT_SIGNING_KEY;\n const signFlag = key ? ['-u', key] : ['-s'];\n const msgFlag = options.message ? ['-m', options.message] : ['-m', options.name];\n const targetArg = options.target ? [options.target] : [];\n await git.raw(['tag', ...signFlag, ...msgFlag, options.name, ...targetArg]);\n return `Created signed tag ${options.name}.`;\n }\n\n if (options.message) {\n await git.addAnnotatedTag(options.name, options.message);\n return `Created annotated tag ${options.name}.`;\n }\n\n // Only pass the tag name (string) to addTag\n await git.addTag(options.name);\n return `Created tag ${options.name}.`;\n}\n\nexport async function runWorktreeAction(repoPath: string, options: WorktreeActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'list') {\n const output = await git.raw(['worktree', 'list', '--porcelain']);\n return output.trim();\n }\n\n if (options.action === 'remove') {\n if (!options.path) {\n throw new Error('path is required for worktree remove.');\n }\n await git.raw(['worktree', 'remove', options.path]);\n return `Removed worktree ${options.path}.`;\n }\n\n if (!options.path || !options.branch) {\n throw new Error('path and branch are required for worktree add.');\n }\n\n await git.raw(['worktree', 'add', options.path, options.branch]);\n return `Added worktree at ${options.path} for ${options.branch}.`;\n}\n\nexport async function runSubmoduleAction(repoPath: string, options: SubmoduleActionOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'list') {\n const output = await git.raw(['submodule', 'status']);\n return output.trim() || 'No submodules.';\n }\n\n if (options.action === 'sync') {\n const args = ['submodule', 'sync'];\n if (options.recursive) {\n args.push('--recursive');\n }\n const output = await git.raw(args);\n return output.trim() || 'Submodule sync complete.';\n }\n\n if (options.action === 'update') {\n const args = ['submodule', 'update', '--init'];\n if (options.recursive) {\n args.push('--recursive');\n }\n const output = await git.raw(args);\n return output.trim() || 'Submodule update complete.';\n }\n\n if (!options.url || !options.path) {\n throw new Error('url and path are required for submodule add.');\n }\n\n await git.raw(['submodule', 'add', options.url, options.path]);\n return `Added submodule ${options.path}.`;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport {\n checkoutRef,\n createBranch,\n deleteBranch,\n listBranches,\n renameBranch,\n setUpstream,\n} from '../services/branch.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerBranchTools(server: McpServer): void {\n server.registerTool(\n 'git_list_branches',\n {\n title: 'List Git Branches',\n description: 'List local branches, or all branches including remotes.',\n inputSchema: {\n repo_path: RepoPathSchema,\n all: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n all,\n response_format,\n }: {\n repo_path: string | undefined;\n all: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const branches = await listBranches(repoPath, all);\n return {\n content: [{ type: 'text', text: render({ branches }, response_format) }],\n structuredContent: { branches },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_create_branch',\n {\n title: 'Create Git Branch',\n description: 'Create a branch from current HEAD or an explicit ref.',\n inputSchema: {\n repo_path: RepoPathSchema,\n name: z.string().min(1),\n from_ref: z.string().optional(),\n checkout: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n name,\n from_ref,\n checkout,\n response_format,\n }: {\n repo_path: string | undefined;\n name: string;\n from_ref?: string;\n checkout: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await createBranch(repoPath, {\n name,\n fromRef: from_ref,\n checkout,\n });\n\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_delete_branch',\n {\n title: 'Delete Git Branch',\n description: 'Delete a local branch.',\n inputSchema: {\n repo_path: RepoPathSchema,\n name: z.string().min(1),\n force: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n name,\n force,\n response_format,\n }: {\n repo_path: string | undefined;\n name: string;\n force: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await deleteBranch(repoPath, { name, force });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_rename_branch',\n {\n title: 'Rename Git Branch',\n description: 'Rename an existing branch.',\n inputSchema: {\n repo_path: RepoPathSchema,\n old_name: z.string().min(1),\n new_name: z.string().min(1),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n old_name,\n new_name,\n response_format,\n }: {\n repo_path: string | undefined;\n old_name: string;\n new_name: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await renameBranch(repoPath, old_name, new_name);\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_checkout',\n {\n title: 'Git Checkout',\n description: 'Checkout a branch, tag, or commit; optionally create a new local branch.',\n inputSchema: {\n repo_path: RepoPathSchema,\n ref: z.string().min(1),\n create: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n ref,\n create,\n response_format,\n }: {\n repo_path: string | undefined;\n ref: string;\n create: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await checkoutRef(repoPath, ref, create);\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_set_upstream',\n {\n title: 'Set Branch Upstream',\n description: 'Set the upstream tracking branch for a local branch.',\n inputSchema: {\n repo_path: RepoPathSchema,\n branch: z.string().min(1),\n upstream: z.string().min(1),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n branch,\n upstream,\n response_format,\n }: {\n repo_path: string | undefined;\n branch: string;\n upstream: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await setUpstream(repoPath, branch, upstream);\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { getConfig, getContextSummary, searchHistory, setConfig } from '../services/context.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nfunction buildError(error: unknown): { content: Array<{ type: 'text'; text: string }> } {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n}\n\nexport function registerContextTools(server: McpServer): void {\n server.registerTool(\n 'git_context_summary',\n {\n title: 'Git Context Summary',\n description: 'High-signal repository context for LLM-assisted workflows.',\n inputSchema: {\n repo_path: RepoPathSchema,\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({ repo_path, response_format }: { repo_path: string | undefined; response_format: 'markdown' | 'json' }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const summary = await getContextSummary(repoPath);\n return {\n content: [{ type: 'text', text: render(summary, response_format) }],\n structuredContent: { summary },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_search',\n {\n title: 'Git Search',\n description: 'Search code and history using pickaxe and grep.',\n inputSchema: {\n repo_path: RepoPathSchema,\n query: z.string().min(1),\n limit: z.number().int().min(1).max(200).default(20),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n query,\n limit,\n response_format,\n }: {\n repo_path: string | undefined;\n query: string;\n limit: number;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await searchHistory(repoPath, query, limit);\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_get_config',\n {\n title: 'Get Git Config',\n description: 'Read repository/local git configuration values.',\n inputSchema: {\n repo_path: RepoPathSchema,\n key: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n key,\n response_format,\n }: {\n repo_path: string | undefined;\n key?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const value = await getConfig(repoPath, key);\n return {\n content: [{ type: 'text', text: render({ value }, response_format) }],\n structuredContent: { value },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n\n server.registerTool(\n 'git_set_config',\n {\n title: 'Set Git Config',\n description: 'Set repository-local git configuration value.',\n inputSchema: {\n repo_path: RepoPathSchema,\n key: z.string().min(1),\n value: z.string(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n key,\n value,\n response_format,\n }: {\n repo_path: string | undefined;\n key: string;\n value: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await setConfig(repoPath, key, value);\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n return buildError(error);\n }\n },\n );\n}\n","import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { CHARACTER_LIMIT } from '../constants.js';\nimport { getGit } from '../git/client.js';\nimport { getLog, getStatus } from './inspect.service.js';\n\nexport interface ContextSummary {\n readonly branch: string;\n readonly ahead: number;\n readonly behind: number;\n readonly isClean: boolean;\n readonly changedFiles: number;\n readonly recentCommits: Array<{ hash: string; subject: string; dateIso: string }>;\n readonly remotes: string[];\n readonly inProgress: {\n rebasing: boolean;\n merging: boolean;\n cherryPicking: boolean;\n bisecting: boolean;\n };\n}\n\nexport async function getContextSummary(repoPath: string): Promise<ContextSummary> {\n const git = getGit(repoPath);\n const [status, commits, remotesRaw, gitDir] = await Promise.all([\n getStatus(repoPath),\n getLog(repoPath, { limit: 5, offset: 0 }),\n git.getRemotes(false),\n git.raw(['rev-parse', '--absolute-git-dir']).then(s => s.trim()),\n ]);\n\n const rebasing = existsSync(path.join(gitDir, 'rebase-merge')) || existsSync(path.join(gitDir, 'rebase-apply'));\n const merging = existsSync(path.join(gitDir, 'MERGE_HEAD'));\n const cherryPicking = existsSync(path.join(gitDir, 'CHERRY_PICK_HEAD'));\n const bisecting = existsSync(path.join(gitDir, 'BISECT_LOG'));\n\n return {\n branch: status.current,\n ahead: status.ahead,\n behind: status.behind,\n isClean: status.isClean,\n changedFiles: status.files.length,\n recentCommits: commits.map(commit => ({\n hash: commit.hash,\n subject: commit.subject,\n dateIso: commit.dateIso,\n })),\n remotes: remotesRaw.map(remote => remote.name),\n inProgress: {\n rebasing,\n merging,\n cherryPicking,\n bisecting,\n },\n };\n}\n\nexport async function searchHistory(repoPath: string, query: string, limit: number): Promise<string> {\n const git = getGit(repoPath);\n\n const [pickaxe, grep] = await Promise.all([\n git.raw(['log', '-S', query, '--oneline', '-n', String(limit)]),\n git.raw(['grep', '-n', '-m', String(limit), '--', query]).catch(() => ''),\n ]);\n\n const sections = [\n '## Pickaxe (-S)',\n pickaxe.trim() || 'No history matches.',\n '',\n '## grep',\n grep.trim() || 'No working-tree matches.',\n ];\n\n const combined = sections.join('\\n');\n return combined.length > CHARACTER_LIMIT\n ? `${combined.slice(0, CHARACTER_LIMIT)}\\n\\n[Output truncated at ${CHARACTER_LIMIT} characters]`\n : combined;\n}\n\nconst BLOCKED_CONFIG_KEY_PATTERNS: readonly RegExp[] = [/^credential\\./i, /^url\\./i];\n\nconst SENSITIVE_KEY_PATTERNS: readonly RegExp[] = [/(password|token|secret|auth|passphrase)/i];\n\nfunction isBlockedConfigKey(key: string): boolean {\n return BLOCKED_CONFIG_KEY_PATTERNS.some(p => p.test(key));\n}\n\nfunction redactConfigValue(key: string, value: string): string {\n if (SENSITIVE_KEY_PATTERNS.some(p => p.test(key))) {\n return '***';\n }\n // Redact credentials embedded in URLs: https://user:pass@host → https://***@host\n const stripped = value.replace(/(https?:\\/\\/)[^@\\s]+@/g, '$1***@');\n // Redact long hex strings that look like access tokens (not normal in config values)\n if (/\\b[0-9a-f]{40,}\\b/i.test(stripped)) {\n return '***';\n }\n return stripped;\n}\n\nexport async function getConfig(repoPath: string, key?: string): Promise<string> {\n const git = getGit(repoPath);\n\n if (key) {\n if (isBlockedConfigKey(key)) {\n throw new Error(`Access to git config key '${key}' is not permitted.`);\n }\n const value = await git.raw(['config', '--get', key]);\n return redactConfigValue(key, value.trim());\n }\n\n const output = await git.raw(['config', '--list']);\n const lines = output\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean)\n .flatMap(line => {\n const eq = line.indexOf('=');\n if (eq === -1) return [];\n const k = line.slice(0, eq);\n const v = line.slice(eq + 1);\n if (isBlockedConfigKey(k)) return [];\n return [`${k}=${redactConfigValue(k, v)}`];\n });\n\n return lines.join('\\n').trim();\n}\n\nexport async function setConfig(repoPath: string, key: string, value: string): Promise<string> {\n const git = getGit(repoPath);\n await git.raw(['config', key, value]);\n return `Set ${key}.`;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { toGitError } from '../git/client.js';\nimport { ResponseFormatSchema } from '../schemas/index.js';\nimport { fetchGitManPage, searchGitDocs } from '../services/docs.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerDocsTools(server: McpServer): void {\n server.registerTool(\n 'git_docs',\n {\n title: 'Git Documentation',\n description:\n 'Search and browse official Git documentation from git-scm.com. ' +\n 'Use action=\"search\" to find relevant commands and concepts by keyword. ' +\n 'Use action=\"man\" to fetch the full man page for a specific git command ' +\n '(e.g. query=\"commit\" fetches the git-commit man page). ' +\n 'Useful for answering questions about how to use git commands, understanding options, ' +\n 'and discovering the right git command for a task.',\n inputSchema: {\n action: z.enum(['search', 'man']),\n query: z\n .string()\n .min(1)\n .describe(\n 'For action=\"search\": search terms (e.g. \"undo last commit\"). ' +\n 'For action=\"man\": git command name without \"git-\" prefix (e.g. \"commit\", \"rebase\", \"merge\").',\n ),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n action,\n query,\n response_format,\n }: {\n action: 'search' | 'man';\n query: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n if (action === 'search') {\n const results = await searchGitDocs(query);\n const structuredContent: Record<string, unknown> = {\n query: results.query,\n results: results.results,\n };\n\n if (response_format === 'json') {\n return {\n content: [{ type: 'text', text: JSON.stringify(structuredContent, null, 2) }],\n structuredContent,\n };\n }\n\n if (results.results.length === 0) {\n const text = `No results found for \"${query}\" on git-scm.com.`;\n return { content: [{ type: 'text', text }], structuredContent };\n }\n\n const lines = [`## Git Docs Search: \"${results.query}\"`, ''];\n for (const r of results.results) {\n lines.push(`### [${r.title}](${r.url})`);\n if (r.excerpt) lines.push(r.excerpt);\n lines.push('');\n }\n\n const text = lines.join('\\n');\n return { content: [{ type: 'text', text }], structuredContent };\n }\n\n // action === 'man'\n const text = await fetchGitManPage(query);\n return {\n content: [{ type: 'text', text: render(text, response_format) }],\n structuredContent: { command: query, content: text } as Record<string, unknown>,\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { CHARACTER_LIMIT } from '../constants.js';\n\nexport interface GitDocsSearchResult {\n title: string;\n url: string;\n excerpt: string;\n}\n\nexport interface GitDocsSearchResponse {\n query: string;\n results: GitDocsSearchResult[];\n}\n\n/** Strip HTML tags, decode common entities, and collapse whitespace. */\nfunction stripHtml(html: string): string {\n // Remove <script> and <style> blocks including their content\n let text = html.replace(/<(script|style)[^>]*>[\\s\\S]*?<\\/\\1>/gi, ' ');\n // Strip all remaining HTML tags\n text = text.replace(/<[^>]+>/g, ' ');\n // Decode common HTML entities\n text = text\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&nbsp;/g, ' ')\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCodePoint(Number(code)));\n // Collapse whitespace\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/** Extract the content between two markers in an HTML string. */\nfunction extractBetween(html: string, startMarker: RegExp, endMarker: RegExp): string {\n const startMatch = startMarker.exec(html);\n if (!startMatch) return html;\n const startIdx = startMatch.index + startMatch[0].length;\n const remainder = html.slice(startIdx);\n const endMatch = endMarker.exec(remainder);\n return endMatch ? remainder.slice(0, endMatch.index) : remainder;\n}\n\n/**\n * Search git-scm.com for documentation matching a query.\n * Uses the same search endpoint as the site's search box.\n */\nexport async function searchGitDocs(query: string): Promise<GitDocsSearchResponse> {\n const url = `https://git-scm.com/search/results?search=${encodeURIComponent(query)}&language=en`;\n\n let html: string;\n try {\n const response = await fetch(url, {\n headers: { Accept: 'text/html', 'User-Agent': 'git-mcp-docs/1.0' },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n throw new Error(`git-scm.com returned HTTP ${response.status}`);\n }\n html = await response.text();\n } catch (err) {\n throw new Error(`Failed to fetch git docs search: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Parse result entries: each is a <tr> or <li> with a link and excerpt\n // The site returns <li> elements inside <ul class=\"result-list\">\n const results: GitDocsSearchResult[] = [];\n\n // Extract result items via regex — site uses <li> blocks with <a> and <p>\n const listMatch = /<ul[^>]*class=\"[^\"]*result-list[^\"]*\"[^>]*>([\\s\\S]*?)<\\/ul>/i.exec(html);\n const listHtml = listMatch ? listMatch[1] : html;\n\n const itemRegex = /<li[^>]*>([\\s\\S]*?)<\\/li>/gi;\n let itemMatch: RegExpExecArray | null;\n\n while ((itemMatch = itemRegex.exec(listHtml)) !== null) {\n const item = itemMatch[1]!;\n const linkMatch = /<a[^>]+href=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>/i.exec(item);\n if (!linkMatch) continue;\n\n const href = linkMatch[1]!.trim();\n const title = stripHtml(linkMatch[2]!).trim();\n if (!title) continue;\n\n const excerptMatch = /<(?:p|span)[^>]*class=\"[^\"]*excerpt[^\"]*\"[^>]*>([\\s\\S]*?)<\\/(?:p|span)>/i.exec(item);\n const excerpt = excerptMatch ? stripHtml(excerptMatch[1]!).trim() : '';\n\n const fullUrl = href.startsWith('http') ? href : `https://git-scm.com${href}`;\n results.push({ title, url: fullUrl, excerpt });\n }\n\n // Fallback: if no structured results, look for plain <a href=\"/docs/...\"> links\n if (results.length === 0) {\n const linkRegex = /<a[^>]+href=\"(\\/docs\\/[^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a>/gi;\n let m: RegExpExecArray | null;\n const seen = new Set<string>();\n while ((m = linkRegex.exec(html)) !== null && results.length < 20) {\n const href = m[1]!;\n const title = stripHtml(m[2]!).trim();\n if (!title || seen.has(href)) continue;\n seen.add(href);\n results.push({ title, url: `https://git-scm.com${href}`, excerpt: '' });\n }\n }\n\n return { query, results };\n}\n\n/**\n * Fetch the git man page for a command from git-scm.com.\n * Provide the command without the \"git-\" prefix (e.g. \"commit\", \"merge\").\n */\nexport async function fetchGitManPage(command: string): Promise<string> {\n // Normalize: strip leading \"git \" or \"git-\"\n const normalized = command\n .trim()\n .toLowerCase()\n .replace(/^git[- ]/, '');\n\n const url = `https://git-scm.com/docs/git-${normalized}`;\n\n let html: string;\n try {\n const response = await fetch(url, {\n headers: { Accept: 'text/html', 'User-Agent': 'git-mcp-docs/1.0' },\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(\n `No man page found for \"git ${normalized}\". ` + `Check the command name or search with action=\"search\".`,\n );\n }\n throw new Error(`git-scm.com returned HTTP ${response.status} for git-${normalized}`);\n }\n html = await response.text();\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('No man page')) throw err;\n throw new Error(`Failed to fetch git man page: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Extract the main article content\n const articleContent = extractBetween(\n html,\n /<(?:article|div)[^>]*(?:id=\"main\"|class=\"[^\"]*(?:sect|man-page|article)[^\"]*\")[^>]*>/i,\n /<\\/(?:article|div)>/i,\n );\n\n const content = stripHtml(articleContent || html);\n\n const header = `# git-${normalized}(1)\\n\\nSource: ${url}\\n\\n`;\n const full = header + content;\n\n return full.length > CHARACTER_LIMIT\n ? full.slice(0, CHARACTER_LIMIT) + '\\n\\n[...truncated — content exceeded limit]'\n : full;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { runFlowAction } from '../services/flow.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n return JSON.stringify(content, null, 2);\n}\n\nconst FLOW_ACTION_VALUES = [\n 'init',\n 'feature-start',\n 'feature-finish',\n 'feature-publish',\n 'feature-list',\n 'release-start',\n 'release-finish',\n 'release-publish',\n 'release-list',\n 'hotfix-start',\n 'hotfix-finish',\n 'hotfix-list',\n 'support-start',\n 'support-list',\n] as const;\n\nexport function registerFlowTools(server: McpServer): void {\n server.registerTool(\n 'git_flow',\n {\n title: 'Git Flow Actions',\n description:\n 'Implements the git-flow branching model without requiring the git-flow CLI extension. ' +\n 'Supports feature, release, hotfix, and support branches. ' +\n 'Use \"init\" first to configure branch names and prefixes in local git config. ' +\n 'Branch names (main/develop) and prefixes are read from gitflow.* config with sensible defaults. ' +\n 'Actions: init — set up flow config and develop branch. ' +\n 'feature-start/finish/publish/list — manage feature branches off develop. ' +\n 'release-start/finish/publish/list — manage release branches; finish merges to main+develop and tags. ' +\n 'hotfix-start/finish/list — manage hotfix branches off main; finish merges to main+develop and tags. ' +\n 'support-start/list — create long-lived support branches off main.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(FLOW_ACTION_VALUES),\n name: z\n .string()\n .optional()\n .describe('Feature/release/hotfix/support name or version (e.g. \"my-feature\", \"1.2.0\").'),\n main_branch: z\n .string()\n .optional()\n .describe('Override the main branch name (default: gitflow.branch.master config or \"main\").'),\n develop_branch: z\n .string()\n .optional()\n .describe('Override the develop branch name (default: gitflow.branch.develop config or \"develop\").'),\n remote: z.string().optional().describe('Remote name for publish operations (default: \"origin\").'),\n tag: z\n .boolean()\n .default(true)\n .describe('Create an annotated tag when finishing a release or hotfix (default: true).'),\n tag_message: z.string().optional().describe('Message for the version tag.'),\n delete_branch: z\n .boolean()\n .default(true)\n .describe('Delete the branch after a finish operation (default: true).'),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n name,\n main_branch,\n develop_branch,\n remote,\n tag,\n tag_message,\n delete_branch,\n response_format,\n }: {\n repo_path: string | undefined;\n action: (typeof FLOW_ACTION_VALUES)[number];\n name?: string;\n main_branch?: string;\n develop_branch?: string;\n remote?: string;\n tag: boolean;\n tag_message?: string;\n delete_branch: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runFlowAction(repoPath, {\n action,\n name,\n mainBranch: main_branch,\n developBranch: develop_branch,\n remote,\n tag,\n tagMessage: tag_message,\n deleteBranch: delete_branch,\n });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { getGit } from '../git/client.js';\n\nexport type FlowAction =\n | 'init'\n | 'feature-start'\n | 'feature-finish'\n | 'feature-publish'\n | 'feature-list'\n | 'release-start'\n | 'release-finish'\n | 'release-publish'\n | 'release-list'\n | 'hotfix-start'\n | 'hotfix-finish'\n | 'hotfix-list'\n | 'support-start'\n | 'support-list';\n\nexport interface FlowConfig {\n mainBranch: string;\n developBranch: string;\n featurePrefix: string;\n releasePrefix: string;\n hotfixPrefix: string;\n supportPrefix: string;\n versionTagPrefix: string;\n}\n\nexport interface FlowOptions {\n readonly action: FlowAction;\n /** Feature/release/hotfix name or version string. */\n readonly name?: string;\n /** Override the main branch (default: from gitflow config or 'main'). */\n readonly mainBranch?: string;\n /** Override the develop branch (default: from gitflow config or 'develop'). */\n readonly developBranch?: string;\n /** Remote for publish actions. */\n readonly remote?: string;\n /** Whether to create a tag when finishing a release/hotfix (default: true). */\n readonly tag?: boolean;\n /** Message for the version tag. */\n readonly tagMessage?: string;\n /** Whether to delete the branch after finish (default: true). */\n readonly deleteBranch?: boolean;\n}\n\nasync function getFlowConfig(git: ReturnType<typeof getGit>, overrides: FlowOptions): Promise<FlowConfig> {\n const get = async (key: string, fallback: string): Promise<string> => {\n try {\n const value = await git.raw(['config', '--local', key]);\n return value.trim() || fallback;\n } catch {\n return fallback;\n }\n };\n\n const mainBranch = overrides.mainBranch ?? (await get('gitflow.branch.master', 'main'));\n const developBranch = overrides.developBranch ?? (await get('gitflow.branch.develop', 'develop'));\n\n return {\n mainBranch,\n developBranch,\n featurePrefix: await get('gitflow.prefix.feature', 'feature/'),\n releasePrefix: await get('gitflow.prefix.release', 'release/'),\n hotfixPrefix: await get('gitflow.prefix.hotfix', 'hotfix/'),\n supportPrefix: await get('gitflow.prefix.support', 'support/'),\n versionTagPrefix: await get('gitflow.prefix.versiontag', ''),\n };\n}\n\nasync function listBranchesByPrefix(git: ReturnType<typeof getGit>, prefix: string): Promise<string> {\n const result = await git.branch(['-a']);\n const matching = result.all\n .map(b => b.replace(/^remotes\\/[^/]+\\//, '').trim())\n .filter((b, idx, arr) => b.startsWith(prefix) && arr.indexOf(b) === idx)\n .map(b => b.slice(prefix.length));\n return matching.length > 0 ? matching.join('\\n') : `No ${prefix.slice(0, -1)} branches found.`;\n}\n\nasync function branchExists(git: ReturnType<typeof getGit>, branch: string): Promise<boolean> {\n try {\n const result = await git.branch(['-a']);\n return result.all.some(b => b === branch || b === `remotes/origin/${branch}` || b.endsWith(`/${branch}`));\n } catch {\n return false;\n }\n}\n\nexport async function runFlowAction(repoPath: string, options: FlowOptions): Promise<string> {\n const git = getGit(repoPath);\n const cfg = await getFlowConfig(git, options);\n const deleteBranch = options.deleteBranch ?? true;\n const tagOnFinish = options.tag ?? true;\n\n switch (options.action) {\n // -----------------------------------------------------------------------\n // init\n // -----------------------------------------------------------------------\n case 'init': {\n // Persist flow config into local git config\n const sets: Array<[string, string]> = [\n ['gitflow.branch.master', cfg.mainBranch],\n ['gitflow.branch.develop', cfg.developBranch],\n ['gitflow.prefix.feature', cfg.featurePrefix],\n ['gitflow.prefix.release', cfg.releasePrefix],\n ['gitflow.prefix.hotfix', cfg.hotfixPrefix],\n ['gitflow.prefix.support', cfg.supportPrefix],\n ['gitflow.prefix.versiontag', cfg.versionTagPrefix],\n ];\n for (const [key, val] of sets) {\n await git.raw(['config', '--local', key, val]);\n }\n\n // Create develop branch if it doesn't exist\n if (!(await branchExists(git, cfg.developBranch))) {\n await git.checkoutLocalBranch(cfg.developBranch);\n const lines = [`Initialized git flow.`, `Created branch: ${cfg.developBranch}`];\n lines.push(`Main branch: ${cfg.mainBranch}, Develop branch: ${cfg.developBranch}`);\n return lines.join('\\n');\n }\n\n return [\n `Initialized git flow.`,\n `Main branch: ${cfg.mainBranch}, Develop branch: ${cfg.developBranch}`,\n `Prefixes — feature: ${cfg.featurePrefix}, release: ${cfg.releasePrefix}, hotfix: ${cfg.hotfixPrefix}`,\n ].join('\\n');\n }\n\n // -----------------------------------------------------------------------\n // feature\n // -----------------------------------------------------------------------\n case 'feature-list': {\n return listBranchesByPrefix(git, cfg.featurePrefix);\n }\n\n case 'feature-start': {\n if (!options.name) throw new Error('name is required for feature-start.');\n const branch = `${cfg.featurePrefix}${options.name}`;\n await git.checkoutBranch(branch, cfg.developBranch);\n return `Created and switched to branch ${branch} from ${cfg.developBranch}.`;\n }\n\n case 'feature-finish': {\n if (!options.name) throw new Error('name is required for feature-finish.');\n const branch = `${cfg.featurePrefix}${options.name}`;\n await git.checkout(cfg.developBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.developBranch}`]);\n if (deleteBranch) {\n await git.deleteLocalBranch(branch);\n return `Merged ${branch} into ${cfg.developBranch} and deleted branch.`;\n }\n return `Merged ${branch} into ${cfg.developBranch}.`;\n }\n\n case 'feature-publish': {\n if (!options.name) throw new Error('name is required for feature-publish.');\n const branch = `${cfg.featurePrefix}${options.name}`;\n const remote = options.remote ?? 'origin';\n await git.push(remote, branch, ['--set-upstream']);\n return `Published ${branch} to ${remote}.`;\n }\n\n // -----------------------------------------------------------------------\n // release\n // -----------------------------------------------------------------------\n case 'release-list': {\n return listBranchesByPrefix(git, cfg.releasePrefix);\n }\n\n case 'release-start': {\n if (!options.name) throw new Error('name is required for release-start.');\n const branch = `${cfg.releasePrefix}${options.name}`;\n await git.checkoutBranch(branch, cfg.developBranch);\n return `Created and switched to branch ${branch} from ${cfg.developBranch}.`;\n }\n\n case 'release-finish': {\n if (!options.name) throw new Error('name is required for release-finish.');\n const branch = `${cfg.releasePrefix}${options.name}`;\n const tagName = `${cfg.versionTagPrefix}${options.name}`;\n const tagMsg = options.tagMessage ?? `Release ${options.name}`;\n\n // Merge into main\n await git.checkout(cfg.mainBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.mainBranch}`]);\n\n // Tag the release on main\n if (tagOnFinish) {\n await git.addAnnotatedTag(tagName, tagMsg);\n }\n\n // Merge back into develop\n await git.checkout(cfg.developBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.developBranch}`]);\n\n const lines = [\n `Merged ${branch} into ${cfg.mainBranch}.`,\n ...(tagOnFinish ? [`Tagged: ${tagName}`] : []),\n `Merged ${branch} into ${cfg.developBranch}.`,\n ];\n\n if (deleteBranch) {\n await git.deleteLocalBranch(branch);\n lines.push(`Deleted branch ${branch}.`);\n }\n\n return lines.join('\\n');\n }\n\n case 'release-publish': {\n if (!options.name) throw new Error('name is required for release-publish.');\n const branch = `${cfg.releasePrefix}${options.name}`;\n const remote = options.remote ?? 'origin';\n await git.push(remote, branch, ['--set-upstream']);\n return `Published ${branch} to ${remote}.`;\n }\n\n // -----------------------------------------------------------------------\n // hotfix\n // -----------------------------------------------------------------------\n case 'hotfix-list': {\n return listBranchesByPrefix(git, cfg.hotfixPrefix);\n }\n\n case 'hotfix-start': {\n if (!options.name) throw new Error('name is required for hotfix-start.');\n const branch = `${cfg.hotfixPrefix}${options.name}`;\n await git.checkoutBranch(branch, cfg.mainBranch);\n return `Created and switched to branch ${branch} from ${cfg.mainBranch}.`;\n }\n\n case 'hotfix-finish': {\n if (!options.name) throw new Error('name is required for hotfix-finish.');\n const branch = `${cfg.hotfixPrefix}${options.name}`;\n const tagName = `${cfg.versionTagPrefix}${options.name}`;\n const tagMsg = options.tagMessage ?? `Hotfix ${options.name}`;\n\n // Merge into main\n await git.checkout(cfg.mainBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.mainBranch}`]);\n\n // Tag the hotfix on main\n if (tagOnFinish) {\n await git.addAnnotatedTag(tagName, tagMsg);\n }\n\n // Merge back into develop\n await git.checkout(cfg.developBranch);\n await git.raw(['merge', '--no-ff', branch, '-m', `Merge branch '${branch}' into ${cfg.developBranch}`]);\n\n const lines = [\n `Merged ${branch} into ${cfg.mainBranch}.`,\n ...(tagOnFinish ? [`Tagged: ${tagName}`] : []),\n `Merged ${branch} into ${cfg.developBranch}.`,\n ];\n\n if (deleteBranch) {\n await git.deleteLocalBranch(branch);\n lines.push(`Deleted branch ${branch}.`);\n }\n\n return lines.join('\\n');\n }\n\n // -----------------------------------------------------------------------\n // support\n // -----------------------------------------------------------------------\n case 'support-list': {\n return listBranchesByPrefix(git, cfg.supportPrefix);\n }\n\n case 'support-start': {\n if (!options.name) throw new Error('name is required for support-start.');\n const branch = `${cfg.supportPrefix}${options.name}`;\n await git.checkoutBranch(branch, cfg.mainBranch);\n return `Created and switched to branch ${branch} from ${cfg.mainBranch}.`;\n }\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport {\n blameFile,\n getDiff,\n getDiffSummary,\n getLog,\n getReflog,\n getStatus,\n showRef,\n} from '../services/inspect.service.js';\n\nfunction toText(content: unknown, responseFormat: 'markdown' | 'json'): string {\n if (responseFormat === 'json') {\n return JSON.stringify(content, null, 2);\n }\n\n return typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n}\n\nexport function registerInspectTools(server: McpServer): void {\n server.registerTool(\n 'git_status',\n {\n title: 'Git Status',\n description: 'Get repository working tree and branch status.',\n inputSchema: {\n repo_path: RepoPathSchema,\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({ repo_path, response_format }: { repo_path: string | undefined; response_format: 'markdown' | 'json' }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const status = await getStatus(repoPath);\n return {\n content: [{ type: 'text', text: toText(status, response_format) }],\n structuredContent: { status },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_log',\n {\n title: 'Git Log',\n description: 'Get commit history with optional filters and pagination.',\n inputSchema: {\n repo_path: RepoPathSchema,\n limit: z.number().int().min(1).max(200).default(30),\n offset: z.number().int().min(0).default(0),\n author: z.string().optional(),\n grep: z.string().optional(),\n since: z.string().optional(),\n until: z.string().optional(),\n file_path: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n limit,\n offset,\n author,\n grep,\n since,\n until,\n file_path,\n response_format,\n }: {\n repo_path: string | undefined;\n limit: number;\n offset: number;\n author?: string;\n grep?: string;\n since?: string;\n until?: string;\n file_path?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const commits = await getLog(repoPath, {\n limit,\n offset,\n author,\n grep,\n since,\n until,\n filePath: file_path,\n });\n\n return {\n content: [{ type: 'text', text: toText(commits, response_format) }],\n structuredContent: { commits },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_show',\n {\n title: 'Git Show',\n description: 'Show patch and metadata for a commit, tag, or ref.',\n inputSchema: {\n repo_path: RepoPathSchema,\n ref: z.string().min(1),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n ref,\n response_format,\n }: {\n repo_path: string | undefined;\n ref: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await showRef(repoPath, ref);\n return {\n content: [{ type: 'text', text: toText(output, response_format) }],\n structuredContent: { ref, output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_diff',\n {\n title: 'Git Diff',\n description: 'Show unstaged, staged, or ref-to-ref diff. Supports optional LLM-oriented filtering.',\n inputSchema: {\n repo_path: RepoPathSchema,\n mode: z.enum(['unstaged', 'staged', 'refs']).default('unstaged'),\n from_ref: z.string().optional(),\n to_ref: z.string().optional(),\n filtered: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n mode,\n from_ref,\n to_ref,\n filtered,\n response_format,\n }: {\n repo_path: string | undefined;\n mode: 'unstaged' | 'staged' | 'refs';\n from_ref?: string;\n to_ref?: string;\n filtered: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const [summary, output] = await Promise.all([\n getDiffSummary(repoPath, {\n mode,\n fromRef: from_ref,\n toRef: to_ref,\n filtered,\n }),\n getDiff(repoPath, {\n mode,\n fromRef: from_ref,\n toRef: to_ref,\n filtered,\n }),\n ]);\n\n const payload = { summary, output };\n return {\n content: [{ type: 'text', text: toText(payload, response_format) }],\n structuredContent: payload,\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_blame',\n {\n title: 'Git Blame',\n description: 'Show line-level author attribution for a file.',\n inputSchema: {\n repo_path: RepoPathSchema,\n file_path: z.string().min(1),\n ref: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n file_path,\n ref,\n response_format,\n }: {\n repo_path: string | undefined;\n file_path: string;\n ref?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await blameFile(repoPath, file_path, ref);\n return {\n content: [{ type: 'text', text: toText(output, response_format) }],\n structuredContent: { file_path, ref, output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_reflog',\n {\n title: 'Git Reflog',\n description: 'Show local HEAD and ref movement history for recovery.',\n inputSchema: {\n repo_path: RepoPathSchema,\n limit: z.number().int().min(1).max(200).default(30),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n limit,\n response_format,\n }: {\n repo_path: string | undefined;\n limit: number;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await getReflog(repoPath, limit);\n return {\n content: [{ type: 'text', text: toText(output, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { runLfsAction } from '../services/lfs.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerLfsTools(server: McpServer): void {\n server.registerTool(\n 'git_lfs',\n {\n title: 'Git LFS Actions',\n description:\n 'Manage Git Large File Storage (LFS). Supports tracking/untracking file patterns, ' +\n 'listing LFS-tracked files and status, pulling/pushing LFS objects, installing LFS ' +\n 'hooks for the repository, and migrating existing files into or out of LFS storage.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum([\n 'track',\n 'untrack',\n 'ls-files',\n 'status',\n 'pull',\n 'push',\n 'install',\n 'migrate-import',\n 'migrate-export',\n ]),\n patterns: z\n .array(z.string())\n .optional()\n .describe('File glob patterns for track/untrack (e.g. [\"*.psd\", \"*.zip\"]).'),\n remote: z.string().optional().describe('Remote name for pull/push operations.'),\n include: z.string().optional().describe('Comma-separated include patterns for migrate or pull operations.'),\n exclude: z.string().optional().describe('Comma-separated exclude patterns for migrate or pull operations.'),\n everything: z\n .boolean()\n .default(false)\n .describe('Pass --all/--everything to include all refs in push/migrate operations.'),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n action,\n patterns,\n remote,\n include,\n exclude,\n everything,\n response_format,\n }: {\n repo_path: string | undefined;\n action:\n | 'track'\n | 'untrack'\n | 'ls-files'\n | 'status'\n | 'pull'\n | 'push'\n | 'install'\n | 'migrate-import'\n | 'migrate-export';\n patterns?: string[];\n remote?: string;\n include?: string;\n exclude?: string;\n everything: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const output = await runLfsAction(repoPath, {\n action,\n patterns,\n remote,\n include,\n exclude,\n everything,\n });\n return {\n content: [{ type: 'text', text: render({ output }, response_format) }],\n structuredContent: { output },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { getGit } from '../git/client.js';\n\nexport type LfsAction =\n | 'track'\n | 'untrack'\n | 'ls-files'\n | 'status'\n | 'pull'\n | 'push'\n | 'install'\n | 'migrate-import'\n | 'migrate-export';\n\nexport interface LfsOptions {\n readonly action: LfsAction;\n /** File patterns for track/untrack (e.g. \"*.psd\", \"*.zip\"). */\n readonly patterns?: string[];\n /** Remote name for pull/push operations. */\n readonly remote?: string;\n /** Comma-separated include patterns for migrate operations. */\n readonly include?: string;\n /** Comma-separated exclude patterns for migrate operations. */\n readonly exclude?: string;\n /** Pass --everything to migrate-import to rewrite all refs. */\n readonly everything?: boolean;\n}\n\nexport async function runLfsAction(repoPath: string, options: LfsOptions): Promise<string> {\n const git = getGit(repoPath);\n\n switch (options.action) {\n case 'install': {\n const output = await git.raw(['lfs', 'install']);\n return output.trim() || 'Git LFS installed for this repository.';\n }\n\n case 'track': {\n if (!options.patterns || options.patterns.length === 0) {\n throw new Error('patterns is required for lfs track.');\n }\n const output = await git.raw(['lfs', 'track', ...options.patterns]);\n return output.trim() || `Tracking: ${options.patterns.join(', ')}`;\n }\n\n case 'untrack': {\n if (!options.patterns || options.patterns.length === 0) {\n throw new Error('patterns is required for lfs untrack.');\n }\n const output = await git.raw(['lfs', 'untrack', ...options.patterns]);\n return output.trim() || `Untracked: ${options.patterns.join(', ')}`;\n }\n\n case 'ls-files': {\n const output = await git.raw(['lfs', 'ls-files']);\n return output.trim() || 'No LFS-tracked files found.';\n }\n\n case 'status': {\n const output = await git.raw(['lfs', 'status']);\n return output.trim() || 'No LFS status changes.';\n }\n\n case 'pull': {\n const args = ['lfs', 'pull'];\n if (options.remote) args.push(options.remote);\n if (options.include) args.push('--include', options.include);\n if (options.exclude) args.push('--exclude', options.exclude);\n const output = await git.raw(args);\n return output.trim() || 'LFS pull complete.';\n }\n\n case 'push': {\n if (!options.remote) {\n throw new Error('remote is required for lfs push.');\n }\n const args = ['lfs', 'push', options.remote];\n if (options.everything) args.push('--all');\n const output = await git.raw(args);\n return output.trim() || `LFS push to ${options.remote} complete.`;\n }\n\n case 'migrate-import': {\n const args = ['lfs', 'migrate', 'import'];\n if (options.everything) args.push('--everything');\n if (options.include) args.push('--include', options.include);\n if (options.exclude) args.push('--exclude', options.exclude);\n const output = await git.raw(args);\n return output.trim() || 'LFS migrate import complete.';\n }\n\n case 'migrate-export': {\n const args = ['lfs', 'migrate', 'export'];\n if (options.everything) args.push('--everything');\n if (options.include) args.push('--include', options.include);\n if (options.exclude) args.push('--exclude', options.exclude);\n const output = await git.raw(args);\n return output.trim() || 'LFS migrate export complete.';\n }\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { fetchRemote, listRemotes, manageRemote, pullRemote, pushRemote } from '../services/remote.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerRemoteTools(server: McpServer): void {\n server.registerTool(\n 'git_list_remotes',\n {\n title: 'List Git Remotes',\n description: 'List configured repository remotes with fetch and push URLs.',\n inputSchema: {\n repo_path: RepoPathSchema,\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: true,\n idempotentHint: true,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({ repo_path, response_format }: { repo_path: string | undefined; response_format: 'markdown' | 'json' }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const remotes = await listRemotes(repoPath);\n return {\n content: [{ type: 'text', text: render({ remotes }, response_format) }],\n structuredContent: { remotes },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_remote',\n {\n title: 'Manage Git Remotes',\n description: 'Add, remove, or set URL for remotes using action-based input.',\n inputSchema: {\n repo_path: RepoPathSchema,\n action: z.enum(['add', 'remove', 'set-url']),\n name: z.string().min(1),\n url: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n action,\n name,\n url,\n response_format,\n }: {\n repo_path: string | undefined;\n action: 'add' | 'remove' | 'set-url';\n name: string;\n url?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await manageRemote(repoPath, { action, name, url });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_fetch',\n {\n title: 'Git Fetch',\n description: 'Fetch updates from remote with optional pruning.',\n inputSchema: {\n repo_path: RepoPathSchema,\n remote: z.string().optional(),\n branch: z.string().optional(),\n prune: z.boolean().default(true),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n remote,\n branch,\n prune,\n response_format,\n }: {\n repo_path: string | undefined;\n remote?: string;\n branch?: string;\n prune: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await fetchRemote(repoPath, { remote, branch, prune });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_pull',\n {\n title: 'Git Pull',\n description: 'Pull from remote with merge (default) or rebase mode.',\n inputSchema: {\n repo_path: RepoPathSchema,\n remote: z.string().optional(),\n branch: z.string().optional(),\n rebase: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n remote,\n branch,\n rebase,\n response_format,\n }: {\n repo_path: string | undefined;\n remote?: string;\n branch?: string;\n rebase: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await pullRemote(repoPath, { remote, branch, rebase });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_push',\n {\n title: 'Git Push',\n description:\n 'Push to remote. Supports safe force (`--force-with-lease`), hard force (if enabled server-side), ' +\n 'and bypassing pre-push hooks (if enabled server-side).',\n inputSchema: {\n repo_path: RepoPathSchema,\n remote: z.string().optional(),\n branch: z.string().optional(),\n set_upstream: z.boolean().default(false),\n force_with_lease: z.boolean().default(false),\n force: z\n .boolean()\n .default(false)\n .describe(\n 'Hard force push (--force). Only accepted when GIT_ALLOW_FORCE_PUSH=true is set on the server. ' +\n 'Prefer force_with_lease unless you have a specific reason for a hard force.',\n ),\n no_verify: z\n .boolean()\n .default(false)\n .describe(\n 'Bypass pre-push hooks (--no-verify). Only accepted when GIT_ALLOW_NO_VERIFY=true is set on the server.',\n ),\n tags: z.boolean().default(false),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: true,\n },\n },\n async ({\n repo_path,\n remote,\n branch,\n set_upstream,\n force_with_lease,\n force,\n no_verify,\n tags,\n response_format,\n }: {\n repo_path: string | undefined;\n remote?: string;\n branch?: string;\n set_upstream: boolean;\n force_with_lease: boolean;\n force: boolean;\n no_verify: boolean;\n tags: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await pushRemote(repoPath, {\n remote,\n branch,\n setUpstream: set_upstream,\n forceWithLease: force_with_lease,\n force,\n noVerify: no_verify,\n tags,\n });\n\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { ALLOW_FORCE_PUSH, ALLOW_NO_VERIFY } from '../config.js';\nimport { getGit } from '../git/client.js';\nimport type { RemoteInfo } from '../types.js';\n\nexport interface ManageRemoteOptions {\n readonly action: 'add' | 'remove' | 'set-url';\n readonly name: string;\n readonly url?: string;\n}\n\nexport interface FetchOptions {\n readonly remote?: string;\n readonly branch?: string;\n readonly prune: boolean;\n}\n\nexport interface PullOptions {\n readonly remote?: string;\n readonly branch?: string;\n readonly rebase: boolean;\n}\n\nexport interface PushOptions {\n readonly remote?: string;\n readonly branch?: string;\n readonly setUpstream: boolean;\n readonly forceWithLease: boolean;\n /** Hard force push. Requires ALLOW_FORCE_PUSH=true. Only use when you know what you are doing. */\n readonly force?: boolean;\n /** Pass --no-verify to bypass pre-push hooks. Requires ALLOW_NO_VERIFY=true. */\n readonly noVerify?: boolean;\n readonly tags: boolean;\n}\n\nfunction sanitizeRemoteUrl(url: string | undefined): string | undefined {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n if (!parsed.username && !parsed.password) return url;\n parsed.username = '';\n parsed.password = '';\n return parsed.toString();\n } catch {\n // SCP-style URLs (e.g. git@github.com:org/repo.git) are not parseable by URL\n return url;\n }\n}\n\nexport async function listRemotes(repoPath: string): Promise<RemoteInfo[]> {\n const git = getGit(repoPath);\n const remotes = await git.getRemotes(true);\n\n return remotes.map(remote => ({\n name: remote.name,\n fetchUrl: sanitizeRemoteUrl(remote.refs.fetch),\n pushUrl: sanitizeRemoteUrl(remote.refs.push),\n }));\n}\n\nexport async function manageRemote(repoPath: string, options: ManageRemoteOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.action === 'add') {\n if (!options.url) {\n throw new Error(\"url is required for action='add'\");\n }\n await git.addRemote(options.name, options.url);\n return `Added remote ${options.name}.`;\n }\n\n if (options.action === 'remove') {\n await git.removeRemote(options.name);\n return `Removed remote ${options.name}.`;\n }\n\n if (!options.url) {\n throw new Error(\"url is required for action='set-url'\");\n }\n\n await git.remote(['set-url', options.name, options.url]);\n return `Updated remote ${options.name} URL.`;\n}\n\nexport async function fetchRemote(repoPath: string, options: FetchOptions): Promise<string> {\n const git = getGit(repoPath);\n\n const args: string[] = [];\n if (options.prune) {\n args.push('--prune');\n }\n\n // Only pass remote and branch if they are defined, otherwise use overloads\n if (options.remote && options.branch) {\n await git.fetch(options.remote, options.branch, args);\n return `Fetched ${options.remote}/${options.branch}.`;\n } else if (options.remote) {\n await git.fetch(options.remote, args);\n return `Fetched ${options.remote}.`;\n } else {\n await git.fetch(args);\n return 'Fetched default remote.';\n }\n}\n\nexport async function pullRemote(repoPath: string, options: PullOptions): Promise<string> {\n const git = getGit(repoPath);\n\n const pullOptions: string[] = [];\n if (options.rebase) {\n pullOptions.push('--rebase');\n }\n\n await git.pull(options.remote, options.branch, pullOptions);\n return `Pulled ${options.remote ?? 'tracking remote'}${options.branch ? `/${options.branch}` : ''}${options.rebase ? ' with rebase' : ''}.`;\n}\n\nexport async function pushRemote(repoPath: string, options: PushOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.noVerify && !ALLOW_NO_VERIFY) {\n throw new Error(\n 'no_verify is disabled on this server. Set GIT_ALLOW_NO_VERIFY=true to permit bypassing git hooks.',\n );\n }\n\n if (options.force && !ALLOW_FORCE_PUSH) {\n throw new Error(\n 'force push is disabled on this server. Set GIT_ALLOW_FORCE_PUSH=true to enable it. ' +\n 'Consider using force_with_lease instead for a safer alternative.',\n );\n }\n\n const pushOptions: string[] = [];\n if (options.setUpstream) {\n pushOptions.push('--set-upstream');\n }\n\n if (options.forceWithLease) {\n pushOptions.push('--force-with-lease');\n }\n\n if (options.force) {\n pushOptions.push('--force');\n }\n\n if (options.tags) {\n pushOptions.push('--tags');\n }\n\n if (options.noVerify) {\n pushOptions.push('--no-verify');\n }\n\n await git.push(options.remote, options.branch, pushOptions);\n return `Pushed ${options.remote ?? 'tracking remote'}${options.branch ? `/${options.branch}` : ''}.`;\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { resolveRepoPath } from '../config.js';\nimport { toGitError } from '../git/client.js';\nimport { ConfirmSchema, RepoPathSchema, ResponseFormatSchema } from '../schemas/index.js';\nimport { addFiles, commitChanges, resetChanges, restoreFiles, revertCommit } from '../services/write.service.js';\n\nfunction render(content: unknown, format: 'markdown' | 'json'): string {\n if (typeof content === 'string' && format === 'markdown') {\n return content;\n }\n\n return JSON.stringify(content, null, 2);\n}\n\nexport function registerWriteTools(server: McpServer): void {\n server.registerTool(\n 'git_add',\n {\n title: 'Git Add',\n description: 'Stage files in the index.',\n inputSchema: {\n repo_path: RepoPathSchema,\n all: z.boolean().default(false),\n paths: z.array(z.string()).optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n all,\n paths,\n response_format,\n }: {\n repo_path: string | undefined;\n all: boolean;\n paths?: string[];\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await addFiles(repoPath, { all, paths });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_restore',\n {\n title: 'Git Restore',\n description: 'Restore paths in worktree and/or index from current state or source ref.',\n inputSchema: {\n repo_path: RepoPathSchema,\n paths: z.array(z.string()).min(1),\n staged: z.boolean().default(false),\n worktree: z.boolean().default(true),\n source: z.string().optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: true,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n paths,\n staged,\n worktree,\n source,\n response_format,\n }: {\n repo_path: string | undefined;\n paths: string[];\n staged: boolean;\n worktree: boolean;\n source?: string;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await restoreFiles(repoPath, { paths, staged, worktree, source });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_commit',\n {\n title: 'Git Commit',\n description:\n 'Create a commit from staged changes, optionally amending the previous commit. ' +\n 'Supports GPG/SSH commit signing and bypassing git hooks (if enabled server-side).',\n inputSchema: {\n repo_path: RepoPathSchema,\n message: z.string().min(1),\n all: z.boolean().default(false),\n amend: z.boolean().default(false),\n no_edit: z.boolean().default(false),\n sign: z\n .boolean()\n .default(false)\n .describe('Sign the commit with GPG/SSH. Defaults to server AUTO_SIGN_COMMITS setting.'),\n signing_key: z\n .string()\n .optional()\n .describe('Specific signing key ID or path. Falls back to GIT_SIGNING_KEY env var.'),\n no_verify: z\n .boolean()\n .default(false)\n .describe(\n 'Bypass pre-commit and commit-msg hooks (--no-verify). ' +\n 'Only accepted when GIT_ALLOW_NO_VERIFY=true is set on the server.',\n ),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: false,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n message,\n all,\n amend,\n no_edit,\n sign,\n signing_key,\n no_verify,\n response_format,\n }: {\n repo_path: string | undefined;\n message: string;\n all: boolean;\n amend: boolean;\n no_edit: boolean;\n sign: boolean;\n signing_key?: string;\n no_verify: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const commitMessage = await commitChanges(repoPath, {\n message,\n all,\n amend,\n noEdit: no_edit,\n sign,\n signingKey: signing_key,\n noVerify: no_verify,\n });\n\n return {\n content: [{ type: 'text', text: render({ message: commitMessage }, response_format) }],\n structuredContent: { message: commitMessage },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_reset',\n {\n title: 'Git Reset',\n description: 'Reset HEAD/index/worktree by mode. Hard reset requires confirm=true.',\n inputSchema: {\n repo_path: RepoPathSchema,\n mode: z.enum(['soft', 'mixed', 'hard']).default('mixed'),\n target: z.string().optional(),\n paths: z.array(z.string()).optional(),\n confirm: ConfirmSchema,\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n mode,\n target,\n paths,\n confirm,\n response_format,\n }: {\n repo_path: string | undefined;\n mode: 'soft' | 'mixed' | 'hard';\n target?: string;\n paths?: string[];\n confirm: boolean;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n if (mode === 'hard' && !confirm) {\n throw new Error('Hard reset requires confirm=true.');\n }\n\n const repoPath = resolveRepoPath(repo_path);\n const message = await resetChanges(repoPath, { mode, target, paths });\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n\n server.registerTool(\n 'git_revert',\n {\n title: 'Git Revert',\n description: 'Revert a commit without rewriting history.',\n inputSchema: {\n repo_path: RepoPathSchema,\n ref: z.string().min(1),\n no_commit: z.boolean().default(false),\n mainline: z.number().int().min(1).optional(),\n response_format: ResponseFormatSchema,\n },\n annotations: {\n readOnlyHint: false,\n idempotentHint: false,\n destructiveHint: true,\n openWorldHint: false,\n },\n },\n async ({\n repo_path,\n ref,\n no_commit,\n mainline,\n response_format,\n }: {\n repo_path: string | undefined;\n ref: string;\n no_commit: boolean;\n mainline?: number;\n response_format: 'markdown' | 'json';\n }) => {\n try {\n const repoPath = resolveRepoPath(repo_path);\n const message = await revertCommit(repoPath, {\n ref,\n noCommit: no_commit,\n mainline,\n });\n\n return {\n content: [{ type: 'text', text: render({ message }, response_format) }],\n structuredContent: { message },\n };\n } catch (error) {\n const gitError = toGitError(error);\n return { content: [{ type: 'text', text: `Error (${gitError.kind}): ${gitError.message}` }] };\n }\n },\n );\n}\n","import { ALLOW_NO_VERIFY, AUTO_SIGN_COMMITS, DEFAULT_SIGNING_KEY } from '../config.js';\nimport { getGit } from '../git/client.js';\n\nexport interface GitAddOptions {\n readonly all?: boolean;\n readonly paths?: string[];\n}\n\nexport interface GitRestoreOptions {\n readonly paths: string[];\n readonly staged: boolean;\n readonly worktree: boolean;\n readonly source?: string;\n}\n\nexport interface GitCommitOptions {\n readonly message: string;\n readonly all: boolean;\n readonly amend: boolean;\n readonly noEdit: boolean;\n /** Sign the commit. Defaults to AUTO_SIGN_COMMITS server config. */\n readonly sign?: boolean;\n /** Signing key to use. Falls back to DEFAULT_SIGNING_KEY, then git's user.signingkey. */\n readonly signingKey?: string;\n /** Pass --no-verify to bypass pre-commit/commit-msg hooks. Requires ALLOW_NO_VERIFY=true. */\n readonly noVerify?: boolean;\n}\n\nexport interface GitResetOptions {\n readonly mode: 'soft' | 'mixed' | 'hard';\n readonly target?: string;\n readonly paths?: string[];\n}\n\nexport interface GitRevertOptions {\n readonly ref: string;\n readonly noCommit: boolean;\n readonly mainline?: number;\n}\n\nexport async function addFiles(repoPath: string, options: GitAddOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.all) {\n await git.add('.');\n return 'Staged all changes.';\n }\n\n const paths = options.paths ?? [];\n if (paths.length === 0) {\n throw new Error('Provide paths or set all=true.');\n }\n\n await git.add(paths);\n return `Staged ${paths.length} path(s).`;\n}\n\nexport async function restoreFiles(repoPath: string, options: GitRestoreOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (!options.staged && !options.worktree) {\n throw new Error('At least one of staged/worktree must be true.');\n }\n\n const args = ['restore'];\n\n if (options.staged) {\n args.push('--staged');\n }\n\n if (options.worktree) {\n args.push('--worktree');\n }\n\n if (options.source) {\n args.push('--source', options.source);\n }\n\n args.push('--', ...options.paths);\n\n await git.raw(args);\n return `Restored ${options.paths.length} path(s).`;\n}\n\nexport async function commitChanges(repoPath: string, options: GitCommitOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.noVerify && !ALLOW_NO_VERIFY) {\n throw new Error(\n 'no_verify is disabled on this server. Set GIT_ALLOW_NO_VERIFY=true to permit bypassing git hooks.',\n );\n }\n\n const args: string[] = [];\n if (options.all) {\n args.push('-a');\n }\n if (options.amend) {\n args.push('--amend');\n }\n if (options.noEdit) {\n args.push('--no-edit');\n }\n if (options.noVerify) {\n args.push('--no-verify');\n }\n\n const shouldSign = options.sign ?? AUTO_SIGN_COMMITS;\n if (shouldSign) {\n const key = options.signingKey ?? DEFAULT_SIGNING_KEY;\n args.push(key ? `--gpg-sign=${key}` : '--gpg-sign');\n }\n\n // simple-git expects message, then options array (as second arg), not third\n const result = await git.commit(options.message, args);\n return `Committed ${result.commit}.`;\n}\n\nexport async function resetChanges(repoPath: string, options: GitResetOptions): Promise<string> {\n const git = getGit(repoPath);\n\n if (options.paths && options.paths.length > 0) {\n const args = ['reset'];\n if (options.target) {\n args.push(options.target);\n }\n args.push('--', ...options.paths);\n await git.raw(args);\n return `Unstaged ${options.paths.length} path(s).`;\n }\n\n const args = ['reset', `--${options.mode}`];\n if (options.target) {\n args.push(options.target);\n }\n\n await git.raw(args);\n return `Reset completed with mode=${options.mode}.`;\n}\n\nexport async function revertCommit(repoPath: string, options: GitRevertOptions): Promise<string> {\n const git = getGit(repoPath);\n\n const args = ['revert'];\n if (options.noCommit) {\n args.push('--no-commit');\n }\n\n if (typeof options.mainline === 'number') {\n args.push('-m', String(options.mainline));\n }\n\n args.push(options.ref);\n\n await git.raw(args);\n return `Reverted ${options.ref}.`;\n}\n"],"mappings":"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","names":["McpServer","z","path","path","path","server","z","output","server","z","path","z","render","server","z","z","existsSync","path","existsSync","path","render","buildError","server","z","z","render","server","z","text","z","deleteBranch","render","server","z","z","server","z","z","render","server","z","z","render","server","z","z","args","render","server","z","McpServer","z"]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@selfagency/git-mcp",
3
+ "version": "0.1.0",
4
+ "description": "A Git MCP server that doesn't suck",
5
+ "keywords": [
6
+ "git",
7
+ "mcp",
8
+ "model context protocol",
9
+ "server"
10
+ ],
11
+ "bugs": {
12
+ "url": "https://github.com/selfagency/git-mcp/issues"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/selfagency/git-mcp.git"
17
+ },
18
+ "license": "MIT",
19
+ "author": {
20
+ "name": "Daniel Sieradski",
21
+ "email": "daniel@self.agency"
22
+ },
23
+ "type": "module",
24
+ "main": "./index.js",
25
+ "types": "./index.d.ts",
26
+ "files": [
27
+ "./index.js",
28
+ "./index.js.map",
29
+ "./index.d.ts"
30
+ ],
31
+ "bin": {
32
+ "git-mcp": "./index.js"
33
+ },
34
+ "exports": {
35
+ ".": {
36
+ "import": "./index.js",
37
+ "types": "./index.d.ts"
38
+ }
39
+ },
40
+ "dependencies": {
41
+ "@modelcontextprotocol/sdk": "^1.28.0",
42
+ "simple-git": "^3.33.0",
43
+ "zod": "^4.3.6"
44
+ }
45
+ }