# Extension points — google-gemini/gemini-cli

> Canonical page: https://codevetter.com/unpack/gemini-cli/extension-points

# Extension points — google-gemini/gemini-cli

Scanned commit d5b3e3accb26000d273abf16e0f1dd83aa5428a9 (2026-09-21). Generated by codevetter codevetter 1.12.0 on 2026-09-22.

Almost every subsystem is a plug-in point: ICommandLoader implementations feed CommandService; ToolRegistry.registerTool plus the discovery-command and MCP paths add tools; AgentRegistry loads local .md/agent definitions and remote A2A agents; the policy engine loads TOML rule dirs per tier; hooks subscribe to named lifecycle events; extensions bundle all of the above via gemini-extension.json; skills are discovered by SkillManager and activated via ActivateSkillTool; ContentGenerator is a factory interface; and the policy engine, themes, and model-config service all accept externally supplied entries.
- Slash commands plug in through the ICommandLoader interface — BuiltinCommandLoader (hardcoded), FileCommandLoader (TOML in ~/.gemini/commands, project, extension dirs), McpPromptLoader (MCP prompts), SkillCommandLoader — merged by CommandService.create with SlashCommandResolver de-duplicating conflicts by renaming losers. — [packages/cli/src/services/types.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/cli/src/services/types.ts) [packages/cli/src/services/CommandService.ts#L44-82](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/cli/src/services/CommandService.ts#L44-L82) [packages/cli/src/services/BuiltinCommandLoader.ts#L73](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/cli/src/services/BuiltinCommandLoader.ts#L73) [packages/cli/src/services/SlashCommandResolver.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/cli/src/services/SlashCommandResolver.ts) [packages/cli/src/services/SkillCommandLoader.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/cli/src/services/SkillCommandLoader.ts)
- New core tools are added by implementing AnyDeclarativeTool/BaseDeclarativeTool (build() → ToolInvocation with getDescription/shouldConfirmExecute/execute) and registering in Config.createToolRegistry's maybeRegister list, which automatically respects the coreTools allowlist. — [packages/core/src/tools/tools.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/tools/tools.ts) [packages/core/src/config/config.ts#L3939-4087](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/config/config.ts#L3939-L4087) [packages/core/src/tools/tool-registry.ts#L287-314](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/tools/tool-registry.ts#L287-L314)
- Tools can be added without recompiling via settings toolDiscoveryCommand (JSON function declarations on stdout) + toolCallCommand (JSON params on stdin), executed through the optional sandboxManager — a command-protocol plugin surface. — [packages/core/src/tools/tool-registry.ts#L376-533](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/tools/tool-registry.ts#L376-L533)
- MCP servers are the main third-party extension surface: configured in settings/extensions, connected by McpClientManager, their tools appear as DiscoveredMCPTool (MCP_TOOL_PREFIX), prompts become slash commands, and resources are exposed via ReadMcpResourceTool/ListMcpResourcesTool through registries. — [packages/core/src/tools/mcp-client-manager.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/tools/mcp-client-manager.ts) [packages/core/src/tools/mcp-tool.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/tools/mcp-tool.ts) [packages/cli/src/services/McpPromptLoader.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/cli/src/services/McpPromptLoader.ts) [packages/core/src/config/config.ts#L1511-1515](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/config/config.ts#L1511-L1515)
- Extensions are defined by a gemini-extension.json manifest (EXTENSIONS_CONFIG_FILENAME) and can contribute MCP servers, context files, custom commands, agents, skills, hooks, themes, and TOML policies; ExtensionManager handles install/enable/disable/update and variable hydration (${extensionPath} etc.). — [packages/cli/src/config/extension-manager.ts#L64-83](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/cli/src/config/extension-manager.ts#L64-L83) [packages/cli/src/config/extensions/variables.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/cli/src/config/extensions/variables.ts) [docs/extensions/reference.md](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/docs/extensions/reference.md) [docs/extensions/writing-extensions.md](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/docs/extensions/writing-extensions.md)
- The policy engine accepts user rules from multiple TOML directories per tier (default core policies in packages/core/src/policy/policies/*.toml — yolo.toml, read-only.toml, plan.toml, agents.toml etc. — plus --policy paths, workspace, user, and --admin-policy dirs) and dynamic rules pushed over the MessageBus via UpdatePolicy messages. — [packages/core/src/policy/config.ts#L44](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/policy/config.ts#L44) [packages/core/src/policy/policies](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/policy/policies) [packages/core/src/policy/toml-loader.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/policy/toml-loader.ts) [packages/cli/src/config/policy.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/cli/src/config/policy.ts) [packages/core/src/confirmation-bus/types.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/confirmation-bus/types.ts)
- Hooks are user/extension-supplied handlers for HookEventName lifecycle events (SessionStart/End, Before/AfterAgent, Before/AfterModel, BeforeToolSelection, Before/AfterTool) executed by HookRunner and aggregated by HookAggregator, capable of injecting context, modifying model calls, or blocking execution. — [packages/core/src/hooks/types.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/hooks/types.ts) [packages/core/src/hooks/hookSystem.ts#L38-120](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/hooks/hookSystem.ts#L38-L120) [packages/core/src/hooks/hookRunner.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/hooks/hookRunner.ts) [docs/hooks/reference.md](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/docs/hooks/reference.md)
- Subagents plug in via AgentDefinition objects loaded by loadAgentsFromDirectory (project/user/extension dirs) or built in code; kind:'remote' agents are A2A-protocol endpoints resolved through A2AClientManager with pluggable auth via A2AAuthProviderFactory. — [packages/core/src/agents/registry.ts#L17-34](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/agents/registry.ts#L17-L34) [packages/core/src/agents/agentLoader.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/agents/agentLoader.ts) [packages/core/src/agents/a2a-client-manager.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/agents/a2a-client-manager.ts) [packages/core/src/agents/auth-provider/factory.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/agents/auth-provider/factory.ts) [docs/core/remote-agents.md](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/docs/core/remote-agents.md)
- Skills are markdown-based packages discovered by SkillManager from user/project/extension dirs (loadSkillsFromDir), gated by admin settings and folder trust, exposed to the model through ActivateSkillTool whose schema is re-registered with the discovered skill enum. — [packages/core/src/skills/skillManager.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/skills/skillManager.ts) [packages/core/src/skills/skillLoader.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/skills/skillLoader.ts) [packages/core/src/config/config.ts#L1533-1551](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/config/config.ts#L1533-L1551) [docs/cli/creating-skills.md](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/docs/cli/creating-skills.md)
- Model selection is extensible: ModelConfigService resolves per-alias model configs, routing/routingStrategy.ts plus availability policyHelpers decide model per request, handleFallback switches models on quota errors, and ModelMappingContentGenerator remaps names for Code Assist (CCPA_AI_MODEL_MAPPINGS). (inferred) — [packages/core/src/services/modelConfigService.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/services/modelConfigService.ts) [packages/core/src/routing/routingStrategy.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/routing/routingStrategy.ts) [packages/core/src/availability/policyHelpers.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/availability/policyHelpers.ts) [packages/core/src/fallback/handler.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/fallback/handler.ts) [packages/core/src/core/modelMappingContentGenerator.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/core/modelMappingContentGenerator.ts)
- ContentGenerator is a decorated factory: Fake/Recording/Logging/ModelMapping wrappers compose around either the Code Assist server client or @google/genai — new providers slot in by extending createContentGenerator's authType switch. — [packages/core/src/core/contentGenerator.ts#L210-422](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/core/contentGenerator.ts#L210-L422) [packages/core/src/core/loggingContentGenerator.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/core/loggingContentGenerator.ts)
- Tool declarations shown to the model are model-family aware: tools/definitions/coreTools.ts + resolver.ts + model-family-sets produce per-model FunctionDeclarations so tool schemas can be swapped per Gemini version without touching tool implementations. — [packages/core/src/tools/definitions/coreTools.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/tools/definitions/coreTools.ts) [packages/core/src/tools/definitions/resolver.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/tools/definitions/resolver.ts) [packages/core/src/tools/definitions/modelFamilyService.ts](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/tools/definitions/modelFamilyService.ts) [packages/core/src/tools/tool-registry.ts#L663-725](https://github.com/google-gemini/gemini-cli/blob/d5b3e3accb26000d273abf16e0f1dd83aa5428a9/packages/core/src/tools/tool-registry.ts#L663-L725)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
