Chirag Chadha

HubSpot

completed

Built and maintained the developer tools that 4,000+ developers rely on every week, including the MCP server, a full authentication redesign, and the team's first agent-facing infrastructure.

Software Engineer, Developer Experience · 2025 - 2026

+425%quarterly active developers72% still active after 4 weeks
4,000+developers using the tools weekly
70kweekly active AI connector users188% growth across the platform

The problem

HubSpot's developer platform serves over 100,000 active developer accounts. Everything from building apps to deploying projects runs through a CLI and a set of shared libraries. The platform's direction was to make HubSpot accessible from every surface where developers work, and treat AI agents as real users alongside humans.

When I joined the Developer Experience team, the tooling wasn't ready for that. The authentication system used an insecure config format. Logging was inconsistent across the entire codebase. About a third of new developers failed silently during onboarding. And none of the major AI coding agents (Claude Code, Cursor, Codex, Gemini, Windsurf) could interact with HubSpot at all. The developer tools weren't there yet.

MCP server and agent infrastructure

I worked on the HubSpot Developer MCP server, which gives AI agents direct access to the platform: creating projects, managing accounts, deploying builds, and running developer workflows without leaving the editor. I built several core MCP tools, added tool annotations so agents could understand each tool's behavior and side effects before calling it, wired up usage-based feedback tracking to measure real adoption patterns, and fixed issues where agents would hang indefinitely waiting for responses that never came.

Claude CodeCursorCodexGeminiWindsurfHubSpot MCP serverone surface for every agentHubSpot developer platformCRM, projects, local dev, accounts

I also designed a promotion system to get developers onto the MCP server from the CLI. The system detects whether a developer already has the MCP server configured (by checking actual config files rather than storing flags), respects per-surface cooldowns so developers aren't nagged, and tracks attribution to measure which surfaces actually convert to installs. I shipped the whole thing, from architecture to 8+ wired surfaces, in about a week.

Authentication overhaul

I led the largest architectural project on the CLI, a full redesign of how developers authenticate and manage accounts.

The old system stored credentials in a flat YAML file with no directory scoping. If you worked across multiple HubSpot portals (common for agencies and partners), there was nothing stopping you from pushing code to the wrong one. One agency partner I spoke with during customer validation had exactly this happen: they upgraded the CLI and accidentally deployed to a production portal four days later with no warning.

I designed and built a new model that scopes authenticated accounts to directories. You link an account to a project directory, and the CLI knows which portal to target based on where you're running it. I built the proof of concept, collaborated with design on the UX, ran three customer validation calls with agency partners (one managing over 1,000 portals), and iterated on the architecture based on their feedback.

targetDiscovery.ts
// shared target discovery — resolves which account to use
// agents get a structured error instead of a prompt they can't answer
const candidates = await discoverTargetCandidates({
accountFlag: options.account,
profileName: options.profile,
linkedAccounts: getLinkedAccounts(cwd),
globalDefault: getGlobalDefaultAccount(),
});

const selected = candidates.find(c => c.category === 'recommended');

CLI infrastructure

I shipped a lot of foundational work that made the CLI better for both humans and agents.

Agent-first developer experience

Toward the end of my time I led a new direction for the team: making the CLI work reliably when the user is an AI agent, not a human.

How does the CLI need to evolve when the user isn't always a person? Agents can't answer interactive prompts. They need structured output they can parse, deterministic account selection instead of ambient defaults, and clear error signals instead of vague log messages.

I scoped the problem, broke it into three workstreams (CLI contracts, MCP tool quality, and agent-facing documentation), and built the foundational pieces: a shared utility for deterministic account resolution and a repo configuration that lets multiple AI tools (Claude Code, Codex, and others) work with the codebase interchangeably.

The goal is that agents are real users of the platform. Anything a developer can do in the UI, an agent should be able to do through the CLI and MCP.

On-call and cross-team work

During one on-call rotation I closed 70+ stale GitHub issues (some 6+ years old), shipped 14 PRs in five days, and fixed a crash in a repo my team didn't own. I also built a Claude Code automation that triaged and resolved 36 issues in a single 10-minute session, handling the tone and context for each response automatically.

Impact

The MCP server grew the quarterly active developer community by 425%, from 346 to over 1,800 developers, with 72% still active after four weeks. Across the broader platform, AI connector usage grew 188% to 70,000 weekly active users. The authentication redesign fixed silent failures during onboarding and gave developers directory-scoped account targeting for the first time. Tooling I worked on ships to more than 4,000 developers every week across the CLI, shared libraries, and the VS Code extension. In under a year I led 9 projects, cut 20+ releases, and shipped across 8 repositories.

TypeScriptNodeReact InkMCPClaude Code